C++ 速查手冊

4.5 - 位元運算

資料 (data) 儲存在電腦中的方式為利用 01 的編碼,例如八位元 (bit) 的整數 25

0001 1001

另如 ASCII 編碼 (encoding) 中的字母 f

0110 0110

所謂的位元運算 (bit operation) ,就是逐位元進行比較,例如以上兩項編碼做邏輯「或」的位元運算

0001 1001 or 0110 0110

結果會是

0111 1111

C++ 的位元運算子 (bitwise operator) 如下表

運算子 功能 範例
& a & b
| a | b
^ 互斥或 a ^ b
<< 向左位移 a << b
>> 向右位移 a >> b
~ 取 1 的補數 ~a

關鍵字 bitand 的用法如同 &bitor 的用法如同 |xor 的用法如同 ^compl 的用法如同 ~

以下為位元運算的例子

#include <iostream>
  
int main() {
    int a = 192;
    int b = 64;
    
    std::cout << (~a) << std::endl;
    std::cout << (b << 2) << std::endl;
    std::cout << (b >> 2) << std::endl;
    std::cout << (a & b) << std::endl;
    std::cout << (a | b) << std::endl;
    std::cout << (a ^ b) << std::endl;
    
    return 0;
}

/* 《程式語言教學誌》的範例程式
   https://kaiching.org/
   檔名:u0405.cpp
   功能:示範 C++ 的位元運算
   作者:張凱慶*/

編譯後執行,結果如下

$ g++ u0405.cpp
$ ./a.out
-193
256
16
64
192
128
$

由於 192 用二進位 64 位元的表示為

... 0000 0000 1100 0000

取其補數變為

... 1111 1111 0011 1111

換算成十進位為 -193 。類似的 64 用二進位 64 位元的表示為

... 0000 0000 0100 0000

向左位移 2 個位元,變為

... 0000 0001 0000 0000

空出的位元補上 0 ,就變成十進位數字的 256 ,向左位移 2 個位元,就是原數乘上 22 ,也就是說乘以 4 。由於向右位移直接把位元移開,原空出的位元補上 0 ,就變成

... 0000 0000 0001 0000

所以等於除以 22 。且、或、互斥或的運算,以二進位表示如下

1100 0000 and 0100 0000 = 0100 0000
1100 0000  or 0100 0000 = 1100 0000
1100 0000 xor 0100 0000 = 1000 0000

因此 19264 ,結果會是 6419264 ,結果為 192192 互斥或 64 ,結果則是 128

上一頁 4.4 - 邏輯運算
回 C++ 速查手冊首頁
下一頁 4.6 - sizeof 運算