
資料 (data) 儲存在電腦中的方式為利用 0 與 1 的編碼,例如八位元 (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 的用法如同 ~ 。
以下為位元運算的例子
| 001 | #include <iostream> |
| 002 | |
| 003 | int main() { |
| 004 | int a = 192; |
| 005 | int b = 64; |
| 006 | |
| 007 | std::cout << (~a) |
| 008 | << std::endl; |
| 009 | std::cout << (b << 2) |
| 010 | << std::endl; |
| 011 | std::cout << (b >> 2) |
| 012 | << std::endl; |
| 013 | std::cout << (a & b) |
| 014 | << std::endl; |
| 015 | std::cout << (a | b) |
| 016 | << std::endl; |
| 017 | std::cout << (a ^ b) |
| 018 | << std::endl; |
| 019 | |
| 020 | return 0; |
| 021 | } |
| 022 | |
| 023 | /* Kaiching Chang |
| 024 | u0405.cpp |
| 025 | 2014-02 */ |
編譯後執行,結果如下
| $ 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
因此 192 且 64 ,結果會是 64 ; 192 或 64 ,結果為 192 ; 192 互斥或 64 ,結果則是 128 。
continue ...
沒有留言:
張貼留言