新闻中心

位运算小结

作者: 时间:2016-11-28 来源:网络 收藏
位运算符
& bitwise AND
| bitwise inclusive OR
^ bitwise exclusive OR
<< left shift
>> right shift
~ ones 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步得到的对应位,就可以得出结果。
总结:
1. 位运算在硬件操作中经常使用,ARM中更是常见这种多位数的位运算。
2.要记住两个常用位运算的功能 :
~0< 设n == 4 0xfffffff0
~(~0< 设n == 4 0xf
3.在做位运算,尤其是位移时,不要把十六进制和二进制搞混,二进制移4位才相当于十六进制移1位。


关键词:位运算位运算

评论


技术专区

关闭