<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          位運(yùn)算小結(jié)

          作者: 時(shí)間:2016-11-28 來源:網(wǎng)絡(luò) 收藏
          位運(yùn)算符
          & bitwise AND
          | bitwise inclusive OR
          ^ bitwise exclusive OR
          << left shift
          >> right shift
          ~ ones complement (unary)
          在書中遇到一個(gè)寫法:~(~0 << 3),按照自己的理解,~符號(hào)代表位取反,我就想豈不是等于~(1 << 3)
          不幸的是,前者等于0x7,后者等于0xfffffff7。
          括號(hào)內(nèi)是最低位二進(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)
          理解錯(cuò)誤主要在這里,0x8有效位后的高位并沒有打印出0,但是取反的時(shí)候,這些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的結(jié)果做“位或運(yùn)算”。
          過程:
          此處用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的結(jié)果做“|”運(yùn)算(得0xfffffff3)。就可以通過“&”運(yùn)算把任意數(shù)“從p位開始的n位清0”,而其他位不改變。
          4. 把x和上述結(jié)果做“&”運(yùn)算(0xfffffff3 & 0xf),得到0x3,即原低四位1111從第3位起,3、4位被清0(更高位也被清0,但3、4位是我們想要的結(jié)果)。x部分運(yùn)算完畢。
          5. ~(~0 << n)得到0x3(0011)。
          6. 把y和5結(jié)果做“&”運(yùn)算(0011 & 0001),y的最右n位取出,其他位清0(得0001)。
          7. 把6的結(jié)果0001 << (p-1),左移到指定位置得0x4(0100)。y部分運(yùn)算完畢。
          8. 結(jié)果x部分和y部分做“|”運(yùn)算(0100| 11),得到最終結(jié)果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.進(jìn)行~x運(yùn)算,所有位取反。
          2.把步驟1的結(jié)果通過>>(p-1)配合第4步給低位清0。
          3.第2步的結(jié)果和 ~(~0 << n)進(jìn)行“&”運(yùn)算,把不需要的高位也清0。
          4.把步驟3結(jié)果<<(p-1),得到符合位置要求的取反位,同時(shí)保證其他位清0。
          5.同上一題,把x相應(yīng)位清0,然后“|“第4步得到的對(duì)應(yīng)位,就可以得出結(jié)果。
          總結(jié):
          1.位運(yùn)算在硬件操作中經(jīng)常使用,ARM中更是常見這種多位數(shù)的位運(yùn)算。
          2.要記住兩個(gè)常用位運(yùn)算的功能 :
          ~0<設(shè)n == 4 0xfffffff0
          ~(~0<設(shè)n == 4 0xf
          3.在做位運(yùn)算,尤其是位移時(shí),不要把十六進(jìn)制和二進(jìn)制搞混,二進(jìn)制移4位才相當(dāng)于十六進(jìn)制移1位。


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

          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();