Java提供的位元運算符有:左移( << )、右移( >> ) 、無符號右移( >>> ) 、位與( & ) 、位或( | )、位非( ~ )、位異或( ^ ),除了位非( ~ )是一元操作符外,其它的都是二元操作符。
1、左移( << )
Test1、將5左移2位:
package com.xcy;public class Test {public static void main(String[] args) {System.out.println(5<<2);//運行結果是20}}
運行結果是20,但是程式是怎樣執行的呢?
首先會將5轉為2進位表示形式(java中,整數預設就是int類型,也就是32位):
0000 0000 0000 0000 0000 0000 0000 0101 然後左移2位後,低位補0:
0000 0000 0000 0000 0000 0000 0001 0100 換算成10進位為20
2、右移( >> ) ,右移同理,只是方向不一樣罷了(感覺和沒說一樣)
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位,可以表示一個正數,也可以表示一個負數。正數換算成二進位後的最高位為0,負數的二進位最高為為1
例如 -5換算成二進位後為:
1111 1111 1111 1111 1111 1111 1111 1011 (剛開始接觸二進位時,不知道最高位是用來表示正負之分的,當時就總想不通。。明明算起來得到的就是一個正數-_-)
我們分別對5進行右移3位、 -5進行右移3位和無符號右移3位:
package com.xcy;public class Test {public static void main(String[] args) {System.out.println(5>>3);//結果是0System.out.println(-5>>3);//結果是-1System.out.println(-5>>>3);//結果是536870911}}
我們來看看它的移位過程(可以通過其結果換算成二進位進行對比):
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進行補位)
通過其結果轉換成二進位後,我們可以發現,正數右移,高位用0補,負數右移,高位用1補,當負數使用無符號右移時,用0進行部位(自然而然的,就由負數變成了正數了)
注意:筆者在這裡說的是右移,高位補位的情況。正數或者負數左移,低位都是用0補。(自行測試)
4、位與( & )
package com.xcy;public class Test {public static void main(String[] args) {System.out.println(5 & 3);//結果為1}}
還是老套路,將2個運算元和結果都轉換為二進位進行比較:
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
位與:第一個運算元的的第n位於第二個運算元的第n位如果都是1,那麼結果的第n為也為1,否則為0
5、位或( | )
package com.xcy;public class Test {public static void main(String[] args) {System.out.println(5 | 3);//結果為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
位或操作:第一個運算元的的第n位於第二個運算元的第n位 只要有一個是1,那麼結果的第n為也為1,否則為0
6、位異或( ^ )
package com.xcy;public class Test {public static void main(String[] args) {System.out.println(5 ^ 3);//結果為6}}
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
位異或:第一個運算元的的第n位於第二個運算元的第n位 相反,那麼結果的第n為也為1,否則為0
7、位非( ~ ) 位非是一元操作符
package com.xcy;public class Test {public static void main(String[] args) {System.out.println(~5);//結果為-6}}
5轉換為二進位:0000 0000 0000 0000 0000 0000 0000 0101
-------------------------------------------------------------------------------------
-6轉換為二進位:1111 1111 1111 1111 1111 1111 1111 1010
位非:運算元的第n位為1,那麼結果的第n位為0,反之。
由位元運算操作符衍生而來的有:
&= 按位與賦值
|= 按位或賦值
^= 按位非賦值
>>= 右移賦值
>>>= 無符號右移賦值
<<= 賦值左移
和 += 一個概念而已。
舉個例子:
package com.xcy;public class Test {public static void main(String[] args) {int a = 5a &= 3;System.out.println(a);//結果是1}}