位运算小结
&
|
^
<
>>
~
在书中遇到一个写法:~(~0 < 3),按照自己的理解,~符号代表位取反,我就想岂不是等于~(1 < 3)
不幸的是,前者等于0x7,后者等于0xfffffff7。
括号内是最低位二进制表示。
~0 == 0xffffffff(1111)
~0 < 2 == 0xfffffffc(1100)
~(~0 < 3) == 0x7(0111)
1 < 3 == 0x8(1000)
理解错误主要在这里,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)
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.要记住两个常用位运算的功能 :
3.在做位运算,尤其是位移时,不要把十六进制和二进制搞混,二进制移4位才相当于十六进制移1位。
位运算位运算 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)