位運(yùn)算符
位運(yùn)算符主要針對(duì)兩個(gè)二進(jìn)制數(shù)的位進(jìn)行邏輯運(yùn)算肌稻,它包括:與(&)、或(|)碰辅、非(~)、異或(^)**
運(yùn)算規(guī)則:
計(jì)算機(jī)中的數(shù)字運(yùn)算都是以補(bǔ)碼的形式進(jìn)行的千所,所以在做為運(yùn)算時(shí)狂魔,首先將數(shù)字轉(zhuǎn)換為補(bǔ)碼形式。
補(bǔ)碼規(guī)則
- 正數(shù)的原碼淫痰、反碼最楷、補(bǔ)碼都相同。
- 負(fù)數(shù)的反碼是除符號(hào)位為1外待错,其他位全取反
- 負(fù)數(shù)的補(bǔ)碼是反碼加1籽孙,符號(hào)位參與運(yùn)算。(也可以說負(fù)數(shù)的補(bǔ)碼是其絕對(duì)值的原碼取反火俄,末尾再加1)
- 與運(yùn)算符
- 與運(yùn)算符用符號(hào)"&"表示
- 兩個(gè)操作數(shù)中的位都為1犯建,結(jié)果才為1,否則結(jié)果為0瓜客。
示例:
int x = -6 & 8;
輸出:x = 8;
分析:
-6的原碼: 10000000 00000000 00000000 00000110
反碼: 11111111 11111111 11111111 11111001
補(bǔ)碼: 11111111 11111111 11111111 11111110
8的原碼 : 00000000 00000000 00000000 00001000
正數(shù)的原碼适瓦、反碼、補(bǔ)碼都相同即原碼等于補(bǔ)碼谱仪。
根據(jù)"&"運(yùn)算符規(guī)則玻熙,可以得到:
-6&8 :00000000 00000000 00000000 00001000
即-6 & 8 = 8
- 或運(yùn)算符
- 或運(yùn)算符用符號(hào)" | "表示:
- 兩個(gè)位只要有一個(gè)為1,那么結(jié)果就為1疯攒,否則為0嗦随。
int x = 6 | 10;
x = 14;
分析:
6的原碼: 0110
10的原碼:1010
正數(shù)的原碼、反碼卸例、補(bǔ)碼都相同称杨,
根據(jù)兩個(gè)位只要有一個(gè)為1肌毅,那么結(jié)果就為1筷转,否則為0
6 | 10 的二進(jìn)制碼: 1110
1110轉(zhuǎn)換成10進(jìn)制為:14
- 非運(yùn)算符
- 非運(yùn)算符用符號(hào)“~”表示:
- 如果位為0,結(jié)果是1悬而,如果位為1呜舒,結(jié)果為0。
int x = ~6;
x = -7
分析:
6的原碼: 00000000 00000000 00000000 00000110
正數(shù)的原碼笨奠、反碼袭蝗、補(bǔ)碼都相同即原碼等于補(bǔ)碼。
~6(對(duì)6取反): 11111111 11111111 11111111 11111001
很明顯最高位為1般婆,即原碼為負(fù)數(shù)到腥。負(fù)數(shù)的補(bǔ)碼是其絕對(duì)值的原碼取反,末尾在加1蔚袍。因此乡范,我們將這個(gè)二進(jìn)制補(bǔ)碼進(jìn)行還原:
末尾減1得反碼:11111111 11111111 11111111 11111000
對(duì)反碼取反的原碼配名,可以有兩種形式:
1、得到原碼的絕對(duì)值:
00000000 00000000 00000000 00000111
這就是|~6| = 7 (~6的絕對(duì)值等于7)晋辆。
2渠脉、直接得到原碼:
負(fù)數(shù)的反碼是除符號(hào)位為1外,其他位全取反
10000000 00000000 00000000 00000111
所以瓶佳, ~6 = -7
4芋膘、異或運(yùn)算符
- 亦或運(yùn)算符符號(hào)是“^”表示:
- 兩個(gè)操作數(shù)的位中,相同則結(jié)果為0霸饲,不同則結(jié)果為1为朋。
int x = 6^8
x = 14
分析:
6的原碼(即補(bǔ)碼): 00000000 00000000 00000000 00000110
8的原碼(即補(bǔ)碼): 00000000 00000000 00000000 00001000
根據(jù)異或運(yùn)算符規(guī)則:
6 ^ 8 補(bǔ)碼: 00000000 00000000 00000000 00001110
即 6 ^ 8 = 14
移位運(yùn)算符
移位運(yùn)算符操作的對(duì)象就是二進(jìn)制的位,可以單獨(dú)用移位運(yùn)算符來處理int型整數(shù)贴彼。
<<:左移運(yùn)算符潜腻,將運(yùn)算符左邊的對(duì)象向左移動(dòng)運(yùn)算符右邊指定的位數(shù)(在低位補(bǔ)0)
" >> " : “有符號(hào)”右移運(yùn)算符,將運(yùn)算符左邊的對(duì)象向右移動(dòng)指定的位數(shù)器仗。使用符號(hào)擴(kuò)展機(jī)制也就是說融涣,如果值為正,則在高位補(bǔ)0精钮,如果值為負(fù)威鹿,則在高位補(bǔ)1。
' >>> ': "無符號(hào)"右移運(yùn)算符轨香,將運(yùn)算符左側(cè)的對(duì)象向右移動(dòng)運(yùn)算符右邊指定的位數(shù)忽你。采用0擴(kuò)展機(jī)制,也就是說臂容,無論值正負(fù)科雳,都在高位補(bǔ)0。
x = 6;
x << 1 = 12
分析:
6的二進(jìn)制碼: 0110
將6的二進(jìn)制碼向左移動(dòng)1位脓杉,低位補(bǔ)0得:
6 << 1 : 1100
所以 6<<1 = 12
6 >>1 = 3
分析:
6的二進(jìn)制碼: 0110
將6的二進(jìn)制碼向右移動(dòng)1位糟秘,高位補(bǔ)0得:
6 >> 1 : 0011
所以 6>>1 = 3
- num << n,相當(dāng)于num*2^n
- num >> n,相當(dāng)于num/2^n