C++ 快速導覽 - 位元運算

資料 (data) 儲存在電腦中的方式為利用 0 與 1 的編碼,例如八位元 (bit) 的整數 (integer) 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


以下為位元運算的例子
#include <iostream>
 
int main(void)
{
    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;
}

/* 《程式語言教學誌》的範例程式
    http://pydoing.blogspot.com/
    檔名:bitwise.cpp
    功能:示範位元運算
    作者:張凱慶
    時間:西元 2010 年 10 月 */


編譯後執行,結果如下



由於 192 用二進位 32 位元的表示為
0000 0000 0000 0000 0000 0000 1100 0000


取其補數變為
1111 1111 1111 1111 1111 1111 0011 1111


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


向左位移 2 個位元,變為
0000 0000 0000 0000 0000 0001 0000 0000


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


所以兩個運算結果都是 0 。且、或、互斥或的運算,以二進位表示如下
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 。


中英文術語對照
資料data
位元bit
整數integer
編碼encoding
位元運算bit operation
位元運算子bitwise operator


您可以繼續參考
運算式
型態轉換


相關目錄
回 C++ 快速導覽
回 C++ 教材
回首頁


參考資料
C++ reference
cplusplus.com
Cprogramming.com C++ Tutorial

C++ Primer, Fourth Edition, Stanley B. Lippman...


本文於 2013 年 1 月更新

沒有留言: