您的位置 首页 主动

位运算小结

位运算符:bitwiseAND

位运算符

& 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位。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/zhudong/256721.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部