位運算符
位運算符主要針對兩個二進制數的位進行邏輯運算,它包括:與(&)、或(|)、非(~)、異或(^)**
運算規則:
計算機中的數字運算都是以補碼的形式進行的,所以在做為運算時,首先將數字轉換為補碼形式。
補碼規則
- 正數的原碼、反碼、補碼都相同。
- 負數的反碼是除符號位為1外,其他位全取反
- 負數的補碼是反碼加1,符號位參與運算。(也可以說負數的補碼是其絕對值的原碼取反,末尾再加1)
- 與運算符
- 與運算符用符號"&"表示
- 兩個操作數中的位都為1,結果才為1,否則結果為0。
示例:
int x = -6 & 8;
輸出:x = 8;
分析:
-6的原碼: 10000000 00000000 00000000 00000110
反碼: 11111111 11111111 11111111 11111001
補碼: 11111111 11111111 11111111 11111110
8的原碼 : 00000000 00000000 00000000 00001000
正數的原碼、反碼、補碼都相同即原碼等于補碼。
根據"&"運算符規則,可以得到:
-6&8 :00000000 00000000 00000000 00001000
即-6 & 8 = 8
- 或運算符
- 或運算符用符號" | "表示:
- 兩個位只要有一個為1,那么結果就為1,否則為0。
int x = 6 | 10;
x = 14;
分析:
6的原碼: 0110
10的原碼:1010
正數的原碼、反碼、補碼都相同,
根據兩個位只要有一個為1,那么結果就為1,否則為0
6 | 10 的二進制碼: 1110
1110轉換成10進制為:14
- 非運算符
- 非運算符用符號“~”表示:
- 如果位為0,結果是1,如果位為1,結果為0。
int x = ~6;
x = -7
分析:
6的原碼: 00000000 00000000 00000000 00000110
正數的原碼、反碼、補碼都相同即原碼等于補碼。
~6(對6取反): 11111111 11111111 11111111 11111001
很明顯最高位為1,即原碼為負數。負數的補碼是其絕對值的原碼取反,末尾在加1。因此,我們將這個二進制補碼進行還原:
末尾減1得反碼:11111111 11111111 11111111 11111000
對反碼取反的原碼,可以有兩種形式:
1、得到原碼的絕對值:
00000000 00000000 00000000 00000111
這就是|~6| = 7 (~6的絕對值等于7)。
2、直接得到原碼:
負數的反碼是除符號位為1外,其他位全取反
10000000 00000000 00000000 00000111
所以, ~6 = -7
4、異或運算符
- 亦或運算符符號是“^”表示:
- 兩個操作數的位中,相同則結果為0,不同則結果為1。
int x = 6^8
x = 14
分析:
6的原碼(即補碼): 00000000 00000000 00000000 00000110
8的原碼(即補碼): 00000000 00000000 00000000 00001000
根據異或運算符規則:
6 ^ 8 補碼: 00000000 00000000 00000000 00001110
即 6 ^ 8 = 14
移位運算符
移位運算符操作的對象就是二進制的位,可以單獨用移位運算符來處理int型整數。
<<:左移運算符,將運算符左邊的對象向左移動運算符右邊指定的位數(在低位補0)
" >> " : “有符號”右移運算符,將運算符左邊的對象向右移動指定的位數。使用符號擴展機制也就是說,如果值為正,則在高位補0,如果值為負,則在高位補1。
' >>> ': "無符號"右移運算符,將運算符左側的對象向右移動運算符右邊指定的位數。采用0擴展機制,也就是說,無論值正負,都在高位補0。
x = 6;
x << 1 = 12
分析:
6的二進制碼: 0110
將6的二進制碼向左移動1位,低位補0得:
6 << 1 : 1100
所以 6<<1 = 12
6 >>1 = 3
分析:
6的二進制碼: 0110
將6的二進制碼向右移動1位,高位補0得:
6 >> 1 : 0011
所以 6>>1 = 3
- num << n,相當于num*2^n
- num >> n,相當于num/2^n