<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

位運算小結

作者: 時(shí)間:2016-11-28 來(lái)源:網(wǎng)絡(luò ) 收藏
位運算符
& bitwise AND
| bitwise inclusive OR
^ bitwise exclusive OR
<< left shift
>> right shift
~ ones complement (unary)
在書(shū)中遇到一個(gè)寫(xiě)法:~(~0 << 3),按照自己的理解,~符號代表位取反,我就想豈不是等于~(1 << 3)
不幸的是,前者等于0x7,后者等于0xfffffff7。
括號內是最低位二進(jìn)制表示。
~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有效位后的高位并沒(méi)有打印出0,但是取反的時(shí)候,這些0全部有效。
書(shū)中第一題:
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位開(kāi)始(包括p位)的n位清0。
2.把y中最右n位取出。
3.把y中取出的n位移至p位作為最低位。
4.把1和3的結果做“位或運算”。
過(guò)程:
此處用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)。就可以通過(guò)“&”運算把任意數“從p位開(kāi)始的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。符合題目要求
書(shū)中第二題:
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.進(jìn)行~x運算,所有位取反。
2.把步驟1的結果通過(guò)>>(p-1)配合第4步給低位清0。
3.第2步的結果和 ~(~0 << n)進(jìn)行“&”運算,把不需要的高位也清0。
4.把步驟3結果<<(p-1),得到符合位置要求的取反位,同時(shí)保證其他位清0。
5.同上一題,把x相應位清0,然后“|“第4步得到的對應位,就可以得出結果。
總結:
1.位運算在硬件操作中經(jīng)常使用,ARM中更是常見(jiàn)這種多位數的位運算。
2.要記住兩個(gè)常用位運算的功能 :
~0<設n == 4 0xfffffff0
~(~0<設n == 4 0xf
3.在做位運算,尤其是位移時(shí),不要把十六進(jìn)制和二進(jìn)制搞混,二進(jìn)制移4位才相當于十六進(jìn)制移1位。


關(guān)鍵詞: 位運算位運算

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>