要獲得一點,可以使用AND對其進行掩蓋。要獲得最低位,例如:
x & 0x01
想想AND的工作原理:必須設置兩個位。由於我們與1進行AND運算,所以除第一個以外的所有位都必須爲0,因爲它們在0x01中爲0。最低位將爲0或1,具體取決於x
中的內容;換句話說,最低位將是x
中的最低位,這正是我們想要的。視覺:
x = abcd
AND 1 = 0001
--------
000d
(其中abcd
代表位的插槽;我們不知道他們是什麼)
將其移動到第3位的位置,只是接班:
(x & 0x01) << 3
視覺上,再次:
x & 0x01 = 000d
<< 3
-----------
d000
要添加它,首先,我們需要清除0這個位置爲我們的位。我們使用,並再次:
x & ~0x08
在這裏,我們顛倒0x08
(這是二進制1000):這意味着除了第3位將所有的位,當我們和與x
,我們得到x
除那一點。
在視覺上,
0x08 = 1000
(invert)
-----------
0111
AND x = abcd
------------
0bcd
結合了OR:
(x & ~0x08) | ((x & 0x01) << 3)
在視覺上,
x & ~0x08 = 0bcd
| ((x & 0x01) << 3) = d000
--------------------------
dbcd
現在,這只是移動位0到第3位,而只是將覆蓋3位。我們仍然需要做3位→0。這只是另:
x & 0x08 >> 3
我們需要清除其現貨:
x & ~0x01
我們可以結合兩種結算件:
x & ~0x09
然後:
(x & ~0x09) | ((x & 0x01) << 3) | ((x & 0x08) >> 3)
那當然只處理最低的半字節。我會把其他人作爲練習。
檢查[位操作黑客(http://graphics.stanford.edu/~seander/bithacks html的);我不確定答案在那裏,但它是第一個看的地方。 –
你目前的代碼是什麼? – Marian
'SwitchBits(0x812)'應該是'0x112',除非您在每個*半字節*中切換位3和0,而不是每個*字節*。 (同樣,'SwitchBits(0x12345678)'應該是'0x12345671'。) – Thanatos