位運(yùn)算全解

位運(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ī)讀卡。


image.png

&運(yùn)算:

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

例子1 :a=15,b=6計(jì)算 a&b:


image.png

例子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ì)算過程:

image.png

位移運(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ì)算過程:


image.png

竟然得到了int能表示的最大值Integer.MaxValue。

使用位運(yùn)算能神奇地解決日常中某些計(jì)算,就像你費(fèi)了九牛二虎之力終于從一個(gè)字符串中過濾出了想要的內(nèi)容,但是人家一個(gè)正則匹配就粗來了,留下你記幾在冷風(fēng)中沉思。

位運(yùn)算使用示例:
  1. 判斷奇偶:
    a&1 等于0 ,a為偶數(shù);等于1,a為奇數(shù)

  2. 取int a的第k位:
    a>>k&1

  3. 取相反數(shù):
    a的相反數(shù) ~a+1

  4. 對(duì)int a,每8位取出(計(jì)算argb需要用到):
    a>>24&0xFF
    a>>16&0xFF
    a>>8&0xFF
    a&0xFF

  5. 不用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交換值

  1. 判斷正負(fù)數(shù):
    int b = a>>31 ,b=0則為正,b=1則為負(fù)

  2. 取絕對(duì)值:

int abs(int a){
      int b;
      a=b>>31;
      return (a^b)-b;
}
  1. 保證不溢出地取平均值:
int average(int x, int y)  
{   
     return (x&y)+((x^y)>>1);
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 位運(yùn)算 位運(yùn)算的運(yùn)算分量只能是整型或字符型數(shù)據(jù),位運(yùn)算把運(yùn)算對(duì)象看作是由二進(jìn)位組成的位串信息,按位完成指定的運(yùn)算,...
    IIronMan閱讀 8,098評(píng)論 0 2
  • 姓名:李浩然 學(xué)號(hào):16030410020 轉(zhuǎn)自:http://blog.csdn.net/Dreaming_My...
    洛花無閱讀 2,787評(píng)論 0 1
  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗(yàn)。 張土汪:刷leetcod...
    土汪閱讀 12,931評(píng)論 0 33
  • 《實(shí)證實(shí)修》 _ 真理,只是真理,是圣人的真理,不一定是看見、口中言語真理的人的真理,不一定是你我的真理。 ...
    連捷一心閱讀 499評(píng)論 1 2
  • 也許結(jié)束生命 是終止罪惡的最好方式 但我不想 不想我死后 還遺臭萬年遭人唾棄 我知道我的罪惡深重 但我不想終其一生...
    俗人輪子閱讀 219評(píng)論 0 0

友情鏈接更多精彩內(nèi)容