Java提供的位運算符有:左移(<<)、右移(>>)、無符號右移(>>>)、位與(&)、位或(|)、位非(~)、位異或(^),除了位非(~)是一元操做符外,其它的都是二元操做符。一、左移(<<)Test一、將5左移2位:[java]packagecom.xcy;publicclassTest{publicstaticvoidmain(String[]args){System.out.println(5<<2);//運行結果是20}}運行結果是20,可是程序是怎樣執行的呢?首先會將5轉爲2進製表示形式(java中,整數默認就是int類型,也就是32位):00000000000000000000000000000101而後左移2位後,低位補0:00000000000000000000000000010100換算成10進製爲20二、右移(>>),右移同理,只是方向不同罷了(感受和沒說同樣)[java]System.out.println(5>>2);//運行結果是1仍是先將5轉爲2進製表示形式:00000000000000000000000000000101而後右移2位,高位補0:00000000000000000000000000000001三、無符號右移(>>>)咱們知道在Java中int類型佔32位,能夠表示一個正數,也能夠表示一個負數。正數換算成二進制後的最高位爲0,負數的二進制最高爲爲1例如-5換算成二進制後爲:11111111111111111111111111111011(剛開始接觸二進制時,不知道最高位是用來表示正負之分的,當時就總想不通。。明明算起來獲得的就是一個正數-_-)咱們分別對5進行右移3位、-5進行右移3位和無符號右移3位:[java]packagecom.xcy;publicclassTest{publicstaticvoidmain(String[]args){System.out.println(5>>3);//結果是0System.out.println(-5>>3);//結果是-1System.out.println(-5>>>3);//結果是536870911}}咱們來看看它的移位過程(能夠經過其結果換算成二進制進行對比):5換算成二進制:000000000000000000000000000001015右移3位後結果爲0,0的二進制爲:00000000000000000000000000000000//(用0進行補位)-5換算成二進制:11111111111111111111111111111011-5右移3位後結果爲-1,-1的二進制爲:11111111111111111111111111111111//(用1進行補位)-5無符號右移3位後的結果536870911換算成二進制:00011111111111111111111111111111//(用0進行補位)經過其結果轉換成二進制後,咱們能夠發現,正數右移,高位用0補,負數右移,高位用1補,當負數使用無符號右移時,用0進行部位(天然而然的,就由負數變成了正數了)注意:筆者在這裏說的是右移,高位補位的狀況。正數或者負數左移,低位都是用0補。(自行測試)四、位與(&)[java]packagecom.xcy;publicclassTest{publicstaticvoidmain(String[]args){System.out.println(5&3);//結果爲1}}仍是老套路,將2個操做數和結果都轉換爲二進制進行比較:5轉換爲二進制:000000000000000000000000000001013轉換爲二進制:00000000000000000000000000000011-------------------------------------------------------------------------------------1轉換爲二進制:00000000000000000000000000000001位與:第一個操做數的的第n位於第二個操做數的第n位若是都是1,那麼結果的第n爲也爲1,不然爲0五、位或(|)[java]packagecom.xcy;publicclassTest{publicstaticvoidmain(String[]args){System.out.println(5|3);//結果爲7}}5轉換爲二進制:000000000000000000000000000001013轉換爲二進制:00000000000000000000000000000011-------------------------------------------------------------------------------------7轉換爲二進制:00000000000000000000000000000111位或操做:第一個操做數的的第n位於第二個操做數的第n位只要有一個是1,那麼結果的第n爲也爲1,不然爲0六、位異或(^)[java]packagecom.xcy;publicclassTest{publicstaticvoidmain(String[]args){System.out.println(5^3);//結果爲6}}5轉換爲二進制:000000000000000000000000000001013轉換爲二進制:00000000000000000000000000000011-------------------------------------------------------------------------------------6轉換爲二進制:00000000000000000000000000000110位異或:第一個操做數的的第n位於第二個操做數的第n位相反,那麼結果的第n爲也爲1,不然爲0七、位非(~)位非是一元操做符[java]packagecom.xcy;publicclassTest{publicstaticvoidmain(String[]args){System.out.println(~5);//結果爲-6}}5轉換爲二進制:00000000000000000000000000000101--------------------------------------------------------------------------------------6轉換爲二進制:11111111111111111111111111111010位非:操做數的第n位爲1,那麼結果的第n位爲0,反之。由位運算操做符衍生而來的有:&=按位與賦值|=按位或賦值^=按位非賦值>>=右移賦值>>>=無符號右移賦值<<=賦值左移和+=一個概念而已。舉個例子:[java]www.2cto.compackagecom.xcy;publicclassTest{publicstaticvoidmain(String[]args){inta=5a&=3;System.out.println(a);//結果是1}}做者:xiaochunyong