首頁 › 半導體、電子電路與資訊計算工具
位元運算計算工具
以二進位的排列確認逐位元邏輯運算與移位的結果。請一邊改變數值,一邊確認用遮罩取出、設定、反轉特定位元的操作,以及以移位做 2 的冪次乘除的原理。
結果
邏輯移位以 0 填補空出的位元,算術右移則以最高位元(符號位元)的值填補。左移時溢出的位元會被捨棄。十進位欄括號內的值,是把最高位元視為符號的二補數值。
以圖表檢視
橫軸的輸入
縱軸的結果
其他輸入維持目前的值,只讓選擇的輸入在目前值的 1/4 到 4 倍之間變化時的結果。紅點是目前的值。
逐位元邏輯運算與遮罩
AND、OR、XOR 會對兩個值相同位置的位元進行運算。AND 只有兩者皆為 1 時才為 1,因此與遮罩(只在想取出的位置為 1 的值)做 AND,就能只取出特定位元。範例的 0b10110100 AND 0x0F 會取出低 4 位元的 0100。OR 用於把位元設為 1(設定),XOR 用於反轉位元,NOT 則反轉所有位元。
移位與 2 的冪次
左移 k 位元,值會變成 2ᵏ 倍;右移 k 位元,則為除以 2ᵏ 後捨去的值(在不溢出的範圍內)。由於移位比乘除法快,編譯器會把乘除 2 的冪次的運算替換成移位。負數右移時,使用以符號位元填補的算術移位,就能得到二補數 除以 2ᵏ 的結果(往負方向捨去)。以 0 填補的邏輯移位,會把負數變成很大的正數。
旋轉
旋轉是把溢出的位元放回另一端的移位。由於位元不會遺失,常用於加密、雜湊函數 與 CRC 的計算。許多 CPU 都有旋轉指令,但 C 語言沒有旋轉運算子,因此以 (x << k) | (x >> (w − k)) 這樣的兩次移位與 OR 撰寫,再由編譯器替換成旋轉指令。
常用的位元運算技巧
x AND 1 可判斷奇偶,x AND (x − 1) 能清除最低位的 1(重複執行即可計算 1 的位元數)。若 x AND (x − 1) 為 0,x 就是 2 的冪次。把一組旗標(表示狀態的位元)以一個整數表示,以 OR 設定、AND 與 NOT 清除、XOR 反轉、AND 確認的用法,常見於嵌入式程式操作暫存器時。
練習相關題目
A 27 B 54 C 58
查看答案與解析 正確答案:B. 54
13 的二進位為 00001101。x << 2 左移2位元得到 00110100 = 52,x >> 1 右移1位元得到 00000110 = 6(移出的最低位的1被捨棄)。邏輯或為 00110110 = 54。52 與 6 代表4的位元都是1,因此與相加的 52 + 6 = 58 不一致。
A 75 B 180 C 210
查看答案與解析 正確答案:B. 180
75 的二進位為 0100 1011。x << 4 把低4位元移到高位得到 1011 0000 = 176(超出的 0100 被捨棄),x >> 4 把高4位元移到低位得到 0000 0100 = 4。邏輯或為 1011 0100 = 180,也就是高4位元與低4位元互換後的值。若不限制在8位元內而當成 75 × 16 = 1200 處理,結果就會改變。
A (x << 3) + (x << 1) B (x << 10) C (x << 2) + x
查看答案與解析 正確答案:A. (x << 3) + (x << 1)
向左移1位元會變成2倍,因此 x << 3 為8倍,x << 1 為2倍。8x + 2x = 10x,所以 (x << 3) + (x << 1) 即可計算出10倍。乘以常數的乘法可以像這樣置換為位移與加法的組合,編譯器也會選用較快的一方。x << 10 為 2¹⁰ = 1024倍,(x << 2) + x 為 4x + x = 5倍。須注意不要把位移的位元數誤認為10倍。
A 124(0111 1100) B −16(1111 0000) C −4(1111 1100)
查看答案與解析 正確答案:C. −4(1111 1100)
在算術位移 (算術右移)中,空出來的最高位元會複製符號位元,因此 1111 1000 會變成 1111 1100,以二補數 而言就是 −4。即使是負數,向右移1位元也會成為除以2的值。若是在最高位填入0的邏輯右移,則會成為 0111 1100 = 124,符號就改變了。−16則是向左移1位元的結果。另須注意,在C語言中將負的有號整數右移時會是哪一種,屬於實作定義(交由編譯系統決定)。
A −7 / 2 為 −3,−7 >> 1 為 −4 B 兩者皆為 −4 C −7 / 2 為 −4,−7 >> 1 為 −3
查看答案與解析 正確答案:A. −7 / 2 為 −3,−7 >> 1 為 −4
C語言(C99以後)的整數除法 ,規定結果向0的方向捨去,因此 −3.5 會成為 −3。另一方面,算術右移的作用是向較小的方向(負無限大的方向)捨去,將 −7(1111 1001)向右移1位元後為 1111 1100 = −4。因此對負數而言,位移與除法並不一致。編譯器在將除以2置換為位移時,會加上處理負數用的修正指令。若是正數,兩者則會一致。
常見問題
算術移位與邏輯移位有什麼不同?
左移兩者相同,都以 0 填補空出的低位元。右移時,邏輯移位以 0 填補高位,算術移位則以符號位元的值填補。有號數除以 2 的冪次時使用算術移位。
什麼是遮罩?
是把想取出或改變的位元位置設為 1(或 0)的值。與 AND 搭配用於取出或清除位元,與 OR 搭配用於設定,與 XOR 搭配用於反轉。
十進位欄括號內的負數是什麼?
是把最高位元視為符號、以二補數解讀時的值。例如 8 位元的 0b10110100,無號為 180,有號為 −76。
考試會怎麼出題?
在日本的基本資訊技術人員考試等資訊類證照考試中,會出現求與遮罩做 AND、OR、XOR 的結果、以移位做乘除、算術移位與邏輯移位的差異,以及科目 B 中使用位元運算的程式追蹤等題目。