2.9 位运算符
位操作:C语言支持位操作符,如位与、位或、位异或等。这些操作符允许你直接操作二进制位,用于位掩码、位集合等应用。这在处理硬件寄存器、图形编程和密码学等领域非常有用。
Bitwise Operators(位操作符):
&
: Bitwise AND(位与)|
: Bitwise OR(位或)^
: Bitwise XOR(位异或)~
: Bitwise NOT(位非)<<
: Left shift(左移)>>
: Right shift(右移)
关于位运算,要在实际的例子中感悟,以下提供一个小例子:
Bitwise operators:Bitwise AND(位与)
在上面的代码中,&
是按位与操作符,用于执行两个整数之间的按位与操作。它将两个整数的每一位进行比较,并在结果中设置一个位,只有在相应的位在两个操作数中都是1时才会设置。具体来说:
unsigned int a = 0b1010;
将二进制数0b1010
赋值给变量a
,这表示a
的二进制值为1010
,对应十进制数值为 10。unsigned int b = 0b1100;
将二进制数0b1100
赋值给变量b
,这表示b
的二进制值为1100
,对应十进制数值为 12。unsigned int result = a & b;
执行按位与操作,它会将a
和b
的每个对应位进行比较,并将结果存储在变量result
中。按位与操作的规则如下:0 & 0
等于0
0 & 1
等于0
1 & 0
等于0
1 & 1
等于1
因此,在这个例子中,a
和 b
的二进制值分别是 1010
和 1100
,按位与操作将它们的对应位进行比较,结果是 1000
,对应十进制数值为 8。所以,result
的值是 0b1000
或十进制值 8,这是按位与操作的结果。这个操作常用于位掩码、清除特定位的标志等操作。
总之,位运算有很多技巧,我目前遇到的也就下面这个例子,更多的例子需要你阅读更多,在更多的案例中感悟、练习和思考。
这段代码是一个用于计算整数 x 中二进制表示中 1 的个数的循环。首先,变量 count 被初始化为 0,用于存储 x 中 1 的个数。然后,开始一个 for 循环,循环的条件是 x 不等于 0。在每次循环迭代中,x 都会被右移一位,这是通过 x >>= 1 实现的。这个操作会将 x 的二进制表示中的所有位向右移动一位,最左边的位将被丢弃,最右边的位将被填充为 0。
在循环体中,使用了一个 if 语句来检查 x 的最低位是否为 1。这是通过 x & 01 实现的,这个操作会将 x 的二进制表示和 01 进行按位与操作,如果 x 的最低位为 1,那么结果就是 1,否则结果就是 0。如果 x 的最低位为 1,那么 count 就会增加 1。这个循环会一直执行,直到 x 变为 0。这时,count 的值就是 x 的二进制表示中 1 的个数。
例如,如果 x 的初始值为 13(在二进制中表示为 1101),那么这个循环会计算出 x 中 1 的个数为 3。
这段代码 x >>= 1 是一个位运算符的使用,它表示将 x 的所有位向右移动一位。
在 C 语言中,>>= 是一个复合赋值运算符,它将右操作数的值(在这里是1)应用到左操作数(在这里是 x)上,并将结果赋值给左操作数。在这个例子中,>> 是右移位运算符,它将 x 的所有位向右移动指定的位数,在这里是一位。
这段代码 x & 01 是一个位运算符的使用,它表示将 x 的二进制表示与 01 进行按位与操作。
在 C 语言中,& 是按位与运算符,它将两个操作数的每一位进行逻辑与操作。如果两个相应的二进制位都为1,则结果为1,否则为0。
在这个例子中,01 是一个二进制数,只有最低位为1,其他位都为0。因此,x & 01 的结果就是 x 的最低位。如果 x 的最低位为1,那么结果就是1,否则结果就是0。
这个操作在处理二进制数据时非常有用,例如在检查一个数的奇偶性、获取一个数的某一位或者清除一个数的某一位等情况中。
Exercise 2-9. In a two's complement number system, x =& (x-1) deletes the rightmost 1-bit in x. Explain why. Use this observation to write a faster ver- sion of bitcount.
Last updated
Was this helpful?