日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Java 位運算(移位、位與、或、異或、非)

 Baruch 2017-08-09

Java提供的位運算符有:左移( << )、右移( >> ) 、無符號右移( >>> ) 、位與( & ) 、位或( | )、位非( ~ )、位異或( ^ ),除了位非( ~ )是一元操作符外,其它的都是二元操作符。

1、左移( << )

Test1、將5左移2位:

  1. package com.xcy;  
  2.   
  3. public class Test {  
  4.     public static void main(String[] args) {  
  5.         System.out.println(5<<2);//運行結果是20  
  6.     }  
  7. }  
運行結果是20,但是程序是怎樣執(zhí)行的呢?

首先會將5轉為2進制表示形式(java中,整數(shù)默認就是int類型,也就是32位):

0000 0000 0000 0000 0000 0000 0000 0101           然后左移2位后,低位補0:

0000 0000 0000 0000 0000 0000 0001 0100           換算成10進制為20

2、右移( >> ) ,右移同理,只是方向不一樣罷了(感覺和沒說一樣)

  1. System.out.println(5>>2);//運行結果是1  
還是先將5轉為2進制表示形式:

0000 0000 0000 0000 0000 0000 0000 0101 然后右移2位,高位補0:

0000 0000 0000 0000 0000 0000 0000 0001


3、無符號右移( >>> )

我們知道在Java中int類型占32位,可以表示一個正數(shù),也可以表示一個負數(shù)。正數(shù)換算成二進制后的最高位為0,負數(shù)的二進制最高為為1

例如  -5換算成二進制后為:

1111 1111 1111 1111 1111 1111 1111 1011   (剛開始接觸二進制時,不知道最高位是用來表示正負之分的,當時就總想不通。。明明算起來得到的就是一個正數(shù)-_-)


我們分別對5進行右移3位、 -5進行右移3位和無符號右移3位:

  1. package com.xcy;  
  2.   
  3. public class Test {  
  4.     public static void main(String[] args) {  
  5.         System.out.println(5>>3);//結果是0  
  6.         System.out.println(-5>>3);//結果是-1  
  7.         System.out.println(-5>>>3);//結果是536870911  
  8.     }  
  9. }  


我們來看看它的移位過程(可以通過其結果換算成二進制進行對比):

5換算成二進制: 0000 0000 0000 0000 0000 0000 0000 0101

5右移3位后結果為0,0的二進制為: 0000 0000 0000 0000 0000 0000 0000 0000        // (用0進行補位)

 -5換算成二進制: 1111 1111 1111 1111 1111 1111 1111 1011

-5右移3位后結果為-1,-1的二進制為: 1111 1111 1111 1111 1111 1111 1111 1111   // (用1進行補位)

-5無符號右移3位后的結果 536870911 換算成二進制: 0001 1111 1111 1111 1111 1111 1111 1111   // (用0進行補位)


通過其結果轉換成二進制后,我們可以發(fā)現(xiàn),正數(shù)右移,高位用0補,負數(shù)右移,高位用1補,當負數(shù)使用無符號右移時,用0進行部位(自然而然的,就由負數(shù)變成了正數(shù)了)

注意:筆者在這里說的是右移,高位補位的情況。正數(shù)或者負數(shù)左移,低位都是用0補。(自行測試)



4、位與( & )

  1. package com.xcy;  
  2.   
  3. public class Test {  
  4.     public static void main(String[] args) {  
  5.         System.out.println(5 & 3);//結果為1  
  6.     }  
  7. }  
還是老套路,將2個操作數(shù)和結果都轉換為二進制進行比較:

5轉換為二進制:0000 0000 0000 0000 0000 0000 0000 0101

3轉換為二進制:0000 0000 0000 0000 0000 0000 0000 0011

-------------------------------------------------------------------------------------

1轉換為二進制:0000 0000 0000 0000 0000 0000 0000 0001

位與:第一個操作數(shù)的的第n位于第二個操作數(shù)的第n位如果都是1,那么結果的第n為也為1,否則為0



5、位或( | )

  1. package com.xcy;  
  2.   
  3. public class Test {  
  4.     public static void main(String[] args) {  
  5.         System.out.println(5 | 3);//結果為7  
  6.     }  
  7. }  

5轉換為二進制:0000 0000 0000 0000 0000 0000 0000 0101

3轉換為二進制:0000 0000 0000 0000 0000 0000 0000 0011

-------------------------------------------------------------------------------------


7轉換為二進制:0000 0000 0000 0000 0000 0000 0000 0111

位或操作:第一個操作數(shù)的的第n位于第二個操作數(shù)的第n位 只要有一個是1,那么結果的第n為也為1,否則為0


6、位異或( ^ )

  1. package com.xcy;  
  2.   
  3. public class Test {  
  4.     public static void main(String[] args) {  
  5.         System.out.println(5 ^ 3);//結果為6  
  6.     }  
  7. }  

5轉換為二進制:0000 0000 0000 0000 0000 0000 0000 0101

3轉換為二進制:0000 0000 0000 0000 0000 0000 0000 0011

-------------------------------------------------------------------------------------


6轉換為二進制:0000 0000 0000 0000 0000 0000 0000 0110

位異或:第一個操作數(shù)的的第n位于第二個操作數(shù)的第n位 相反,那么結果的第n為也為1,否則為0



7、位非( ~ )           位非是一元操作符

  1. package com.xcy;  
  2.   
  3. public class Test {  
  4.     public static void main(String[] args) {  
  5.         System.out.println(~5);//結果為-6  
  6.     }  
  7. }  


 5轉換為二進制:0000 0000 0000 0000 0000 0000 0000 0101

-------------------------------------------------------------------------------------

-6轉換為二進制:1111 1111 1111 1111 1111 1111 1111 1010

位非:操作數(shù)的第n位為1,那么結果的第n位為0,反之。


由位運算操作符衍生而來的有:

&= 按位與賦值

|=  按位賦值

^= 按位賦值

>>= 右移賦值

>>>= 無符號右移賦值

<<= 賦值左移


和 += 一個概念而已。


舉個例子:

  1. package com.xcy;  
  2.   
  3. public class Test {  
  4.     public static void main(String[] args) {  
  5.         int a = 5  
  6.         a &= 3;  
  7.         System.out.println(a);//結果是1  
  8.     }  
  9. }  


    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多