4 2 3 如何用位運算構建特定二進位制數

2021-08-18 02:37:45 字數 1255 閱讀 5147

4.2.3.1、暫存器位操作經常需要特定位給特定值

(1)從上節可知,對暫存器特定位進行置1或者清0或者取反,關鍵性的難點在於要事先構建乙個特別的數,這個數和原來的值進行位與、位或、位異或等操作,即可達到我們對暫存器操作的要求。

(2)解法1:用工具軟體或者計算器或者自己大腦計算,直接給出完整的32位特定數。

優勢:可以完成工作,難度也不大,操作起來也不是太麻煩。

劣勢:依賴工具,而且不直觀,讀程式的人不容易理解。

評價:凑活能用,但是不好用,應該被更好用的方法替代。

(2)解法2:自己寫**用位操作符號(主要是移位和位取反)來構建這個特定的二進位制數

4.2.3.2、使用移位獲取特定位為1的二進位制數

(1)最簡單的就是用移位來獲取乙個特定位為1的二進位制數。譬如我們需要乙個bit3~bit7為1(隱含意思就是其他位全部為0)的二進位制數,可以這樣:(0x1f<<3)

(2)更難一點的要求:獲取bit3~bit7為1,同時bit23~bit25為1,其餘位為0的數:((0x1f<<3) | (7<<23))

4.2.3.3、再結合位取反獲取特定位為0的二進位制數

(1)這次我們要獲取bit4~bit10為0,其餘位全部為1的數。怎麼做?

(2)利用上面講的方法就可以:(0xf<<0)|(0x1fffff<<11)

但是問題是:連續為1的位數太多了,這個數字本身就很難構造,所以這種方法的優勢損失掉了。

(3)這種特定位(比較少)為0而其餘位(大部分)為1的數,不適合用很多個連續1左移的方式來構造,適合左移加位取反的方式來構造。

(2)思路是:先試圖構造出這個數的位相反數,再取反得到這個數。(譬如本例中要構造的數bit4~bit10為0其餘位為1,那我們就先構造乙個bit4~bit10為1,其餘位為0的數,然後對這個數按位取反即可)

4.2.3.4、總結:位與、位或結合特定二進位制數即可完成暫存器位操作需求

(1)如果你要的這個數比較少位為1,大部分位為0,則可以通過連續很多個1左移n位得到。

(2)如果你想要的數是比較少位為0,大部分位為1,則可以通過先構建其位反數,然後再位取反來得到。

(3)如果你想要的數中連續1(連續0)的部分不止1個,那麼可以通過多段分別構造,然後再彼此位與即可。這時候因為參與位或運算的各個數為1的位是不重複的,所以這時候的位或其實相當於幾個數的疊加。

(3).

bit3~bit7為1,bit23~bit25為1,其餘為0,

( ( 0x1f<<3 ) | ( 7<<23 ) )

上例如果1,0的位置對換,使用取反,

二進位制位運算

與運算,6 3 2 或運算 6 3 7 異或運算 6 3 5 反碼 6 7 左移 3 2 12 3 2 2 12 右移 3 1 1 3 2 1 無符號右移 3 1 1 3 2 1 按位與,當兩位同時為1時才為1如 1 1 1 1 0 0 0 1 0 6 3相當於 0110 0011 0010 2 按...

二進位制位運算

一 按位與 位全為1,結果才為1 0 0 0 0 1 0 1 0 0 1 1 1 特殊用法 清零。如果想將乙個單元清零,就是使其全部二進位制位為0,只要與乙個各位都為零的數值相與,結果為零 取乙個數中的指定位。如x 10101110要取x的低4位,用x 00001111 00001110即可 二 按...

位運算 顛倒二進位制位

a代表某字串 a b 異或 相同為0,不同為1 若b是一串0,則a b a,a b 0 a a 0 若b是一串1,則a b a,相當於把a取反,a b a a a a 利用x x 0,可以將三個數中重複的兩個數去掉 n 相當於無符號右移,左邊會補上0 獲取11111111,只需要把0取反 得到倒數第...