微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 位运算小结

位运算小结

时间: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位。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top