位運(yùn)算是以二進(jìn)制為單位的運(yùn)算,其操作數(shù)和運(yùn)算結(jié)果都是整數(shù)值。
位運(yùn)算符:
?& ?位與 x&y
?| ??位或 x|y
?~ ?位非 ~x
?^ ??位異或 ^x
?>>?右移 x>>y
?<<?左移 x<<y
?>>>?無符號(hào)右移 x>>>y
除了^為一元其余都為二元運(yùn)算。
計(jì)算規(guī)則:
&規(guī)定兩對(duì)應(yīng)位都為1則為1,否則為0
| 規(guī)定兩對(duì)應(yīng)位其中有1則為1,否則0
^規(guī)定兩對(duì)應(yīng)位相同則為1,不同為0
~規(guī)定兩對(duì)應(yīng)位按位求補(bǔ)
?<<將二進(jìn)制數(shù)按指定左移幾位,移掉的省略,右邊缺失的位,用0補(bǔ)齊
?>>將二進(jìn)制數(shù)按指定右移幾位,移掉的省略,左邊缺失的位,(該數(shù)是正數(shù))用0補(bǔ)齊,(該數(shù)是負(fù)數(shù))用1補(bǔ)齊
?>>>將二進(jìn)制數(shù)按指定右移幾位,移掉的省略,左邊缺失的位,用0補(bǔ)齊
位運(yùn)算口訣:
清零取反要用與,某位置一可用或
若要取反和交換,輕輕松松用異或
口訣好記,但是計(jì)算的時(shí)候得要十分有耐心,睜大你的眼,死死地盯著位數(shù),位運(yùn)算這貨就像高中時(shí)填寫的機(jī)讀卡。

&運(yùn)算:
位運(yùn)算操作的優(yōu)先級(jí)比較低,如int a = 1<<i+1,程序會(huì)先計(jì)算i+1,再左移操作。
例子1 :a=15,b=6計(jì)算 a&b:

例子2: a=-6,b=-2,計(jì)算a&b:
首先得到6的二進(jìn)制,00000110
負(fù)數(shù)的二進(jìn)制需要該數(shù)正數(shù)按位取反+1
11111001 加1為 11111010
同理的-2的二進(jìn)制 11111110
得到的11111010為負(fù)數(shù),的到該正數(shù)需要-1按位取反。
計(jì)算過程:

位移運(yùn)算:
法則一:任何數(shù)左移(右移)32位的倍數(shù)等于該數(shù)本身。
法則二:在位移運(yùn)算m<<n計(jì)算中,若n為正數(shù),則實(shí)際移動(dòng)的位數(shù)為n%32,若n為負(fù)數(shù),則實(shí)際移動(dòng)的位數(shù)為32+n%32,右移同理。
左移動(dòng)1位,各位數(shù)計(jì)算都會(huì)乘以2;右移1位,各位數(shù)計(jì)算都會(huì)除以2。
所以x<<N,x乘以2的N次方;x>>N,x除以2的N次方;
80>>2 80÷22=20
5<<3 5x23=40
-70>>2 -70÷22=-18
那么問題又來了,-1>>>1是多少?
計(jì)算過程:

竟然得到了int能表示的最大值Integer.MaxValue。
使用位運(yùn)算能神奇地解決日常中某些計(jì)算,就像你費(fèi)了九牛二虎之力終于從一個(gè)字符串中過濾出了想要的內(nèi)容,但是人家一個(gè)正則匹配就粗來了,留下你記幾在冷風(fēng)中沉思。
位運(yùn)算使用示例:
判斷奇偶:
a&1 等于0 ,a為偶數(shù);等于1,a為奇數(shù)取int a的第k位:
a>>k&1取相反數(shù):
a的相反數(shù) ~a+1對(duì)int a,每8位取出(計(jì)算argb需要用到):
a>>24&0xFF
a>>16&0xFF
a>>8&0xFF
a&0xFF不用temp交換兩個(gè)數(shù)值:
很久很久以前有人問我,怎么交換兩個(gè)數(shù)的值,我二話不說寫出了
void swap(int[] arr,i,j ){
int temp;
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
他說了句,low逼,還用這個(gè),然后寫出了
void swap(a,b){
a^=b;
b^=a;
a^=b;
}
計(jì)算過程:
(記住任何數(shù)異或自己都為0;任何數(shù)異0都為本身;進(jìn)行異或的數(shù)可以無序交換)
a=a^b
b=b^a=b^(a^b)=(b^b)^a=a --> b=a
a=a^b=(a^b)^b^(a^b)=(a^a)^(b^b)^b=b --> a=b
實(shí)現(xiàn)了a和b交換值
判斷正負(fù)數(shù):
int b = a>>31 ,b=0則為正,b=1則為負(fù)取絕對(duì)值:
int abs(int a){
int b;
a=b>>31;
return (a^b)-b;
}
- 保證不溢出地取平均值:
int average(int x, int y)
{
return (x&y)+((x^y)>>1);
}