位操作的基本運算符有:與,或,取反,異或,左移,右移。
要會使用位操作運算符,就不得不先對計算機存儲數字的方式有一定的了解。
原碼:原碼是二進制的一種編碼方式,其中最前面的一位叫做符號位——0代表正數,1代表負數,其余為表示值。用一個8位的二進制數舉例。

原碼很好理解,我們可以很容易知道它表示的二進制數,但是它不方便計算機的運算,所以補碼就誕生了。
補碼:補碼是一個數存儲在計算機中的真正形式,而原碼則是現實數字和計算機中數字的一個過渡,橋梁。
下面是補碼與原碼的轉換關系:
正數:正數的補碼就是原碼
負數:負數的補碼是它的絕對值的原碼對每一位進行取反操作(0變1,1變0)所得到的數再加1。如,-1的絕對值為1,1的原碼為00000001,對000000001取反后得到11111110,最后加上1得到11111111,11111111這個數就是-1的補碼。
補碼將減法運算可以等同於加法運算,比如:
![]()
特殊情況:
![]()
得到的補碼不能再轉化成原碼(結果不對),但是我們的把這個特殊的補碼當作-128來看待。
位操作符的應用(位操作的每一個數都是補碼形式):
1. 判斷奇偶數
oid judge(int num) { if (num & 1) //奇數運算的結果為1,偶數則為0 cout << "奇數" endl; else cout << "偶數" << endl; }
2. 交換兩個數
void Swap(int &a, int &b) { if (a != b) { a ^= b; b ^= a; a ^= b; } }
原理解釋:假設a 中 存儲的數字為A,b 為 B。
a ^ = b 等價於 a = a ^ b, 即 a = A ^ B;
b ^ = a 等價於 b = B ^ (A ^ B) ,因為異或運算符滿足交換律,所以B ^ (A ^ B) = (B ^ B) ^ A,容易知道,對兩個相同的數進行異或操作對於0(...0000000),而0和任意一個數進行異或操作對於這個數本身,所以b = A;
同理:a ^ = b 等價於 a = B;
所以,a和b兩個變量中存儲的值發生的交換。
3.變換符號
int change_sign(int a) { return ~a + 1; }
原理解釋:由補碼的知識我們知道,負數補碼由由其對應的正數的補碼(正數補碼 = 原碼)取反后得到,即~a + 1,如果要從正數得到負數則為~(a - 1)。~a + 1 與 ~(a - 1) 的結果一致,所以無論是一個數的符號變化都可以通過~a + 1實現。
4.判斷正負數
void judge(int num) { if (num >> 31) cout << "負數"; else cout << "正數"; }
