& bitwise AND
| bitwise inclusive OR
^ bitwise exclusive OR
<< left shift
>> right shift
~ one's complement (unary)
在书中遇到一个写法:~(~0 << 3),按照自己的理解,~符号代表位取反,我就想岂不是等于~(1 << 3)
不幸的是,前者等于0x7,后者等于0xfffffff7。
括号内是最低位二进制表示。
~0 == 0xffffffff(1111) ~0 << 1 == 0xfffffffe (1110)
~0 << 2 == 0xfffffffc(1100) ~0 << 3 == 0xfffffff8(1000)
~(~0 << 3) == 0x7(0111)
1 << 3 == 0x8(1000) ~(1 << 3) == 0xfffffff7(0111)
理解错误主要在这里,0x8有效位后的高位并没有打印出0,但是取反的时候,这些0全部有效。
书中第一题:
Write a function setbits(x,p,n,y) that returns x with the n bits that begin at position
p set to the rightmost n bits of y, leaving the other bits unchanged.
思路:
1.把x中从p位开始(包括p位)的n位清0。
2.把y中最右n位取出。
3.把y中取出的n位移至p位作为最低位。
4.把1和3的结果做“位或运算”。
过程:
此处用setbits (15, 3, 2, 8)作为例子(x = 1111, p = 3, n = 2, y = 1001)。
1. ~0 << (p+n-1) 得到 0xfffffff0,即低四位为0000。
2. ~(~0 << (p-1)) 得到 0x3,即低四位为0011。
3. 把1和2的结果做“|”运算(得0xfffffff3)。就可以通过“&”运算把任意数“从p位开始的n位清0”,而其他位不改变。
4. 把x和上述结果做“&”运算(0xfffffff3 & 0xf),得到0x3,即原低四位1111从第3位起,3、4位被清0(更高位也被清0,但3、4位是我们想要的结果)。x部分运算完毕。
5. ~(~0 << n)得到0x3(0011)。
6. 把y和5结果做“&”运算(0011 & 0001),y的最右n位取出,其他位清0(得0001)。
7. 把6的结果0001 << (p-1),左移到指定位置得0x4(0100)。y部分运算完毕。
8. 结果x部分和y部分做“|”运算(0100| 11),得到最终结果0111。符合题目要求
书中第二题:
Write a function invert(x,p,n) that returns x with the n bits that begin at position p
inverted (i.e., 1 changed into 0 and vice versa), leaving the others unchanged.
思路:
1.进行~x运算,所有位取反。
2.把步骤1的结果通过>>(p-1)配合第4步给低位清0。
3.第2步的结果和 ~(~0 << n)进行“&”运算,把不需要的高位也清0。
4.把步骤3结果<<(p-1),得到符合位置要求的取反位,同时保证其他位清0。
5.同上一题,把x相应位清0,然后“|“第4步得到的对应位,就可以得出结果。