1. 程式人生 > 其它 >JAVA位運算子<<,>>,>>>,&,|,^,~(第7節)

JAVA位運算子<<,>>,>>>,&,|,^,~(第7節)

JAVA的位運算子包括以下

& 與

| 或

^ 異或

~ 非(取反)

>> 右移

<< 左移

>>> 無符號右移

如何區分位運算子和邏輯運算子:

邏輯運算子左右連線的是布林型別的運算元

位運算子左右連線的是具體的數值

舉例逐個說明位運算子

PS:

整數的預設型別為int,int型別佔4個字元,一個字元佔8位;

所以十進位制的1,二進位制數為:00000000 00000000 00000000 00000001

1 左移 <<

3 << 2 = 12

3的二進位制為
00000000 00000000 00000000 00000011 -->2
二進位制位整體向左移動2位後,空缺位置用0填充,如下
000000 00000000 00000000 0000001100 -->12
故3 
<< 2 = 12

2 有符號右移 >>

6 >> 2 = 1

6的二進位制為
00000000 00000000 00000000 00000110 -->6
二進位制位整體向右移動2位後,空缺位置用0填充,如下
0000000000 00000000 00000000 000001 -->1
故6 >> 2 = 1

-6 >> 2 = -2

第一步,得到-6的二進位制數
如何推匯出負數的二進位制數
已知正數6的二進位制數如下:
00000000 00000000 00000000 00000110 -->6
取反
11111111 11111111 11111111 11111001 
+1
11111111 11111111 11111111 11111010 得到-6的二進位制數

第二步,根據
-6的二進位制數移位 -6 >> 2,向右移動2位,空缺位用符號數填充,正數的符號數為0,負數的符號數為1 1111111111 11111111 11111111 111110 -->此為-6右移2位的二進位制數 第三步,推匯出-6右移2位的二進位制數為十進位制的哪個數字,得出結果 跟第一步的操作順序相反 -1 1111111111 11111111 11111111 111101 取反 00000000 00000000 00000000 00000010 -->2 結果2加符號 -2 得出:-6 >> 2 = -2

3 無符號右移 >>>

-6 >>> 2 =1073741822

第一步,得到-6的二進位制數
已知正數6的二進位制數如下:
00000000 00000000 00000000 00000110 -->6 取反 11111111 11111111 11111111 11111001 +1 11111111 11111111 11111111 11111010 得到-6的二進位制數 第二步,得到-6位移後的二進位制數 -6 >>> 2,向右移動2位。因為無符號移位,空缺位用0填充 0011111111 11111111 11111111 111110 --> 1073741822 得出:-6 >>> 2 = 1073741822

4 與 &

6 & 3 = 2

00000000 00000000 00000000 00000110 -->6
00000000 00000000 00000000 00000011 -->3
-------------------------------------->&,兩個都為1則為1,否則為0
00000000 00000000 00000000 00000010 -->2

5 或 |

6 | 3 = 7

00000000 00000000 00000000 00000110 -->6
00000000 00000000 00000000 00000011 -->3
-------------------------------------->|,兩個有一個為1則為1,否則為0
00000000 00000000 00000000 00000111 -->7

6 異或 ^

6 ^ 3 = 5

00000000 00000000 00000000 00000110 -->6
00000000 00000000 00000000 00000011 -->3
-------------------------------------->^,兩個不同則為1,相同為0
00000000 00000000 00000000 00000101 -->5

7 非(取反) ~

~6 = -7

00000000 00000000 00000000 00000110 -->6
-------------------------------------->~,取反,1變0,0變1
11111111 11111111 11111111 11111001 -->取反後的二進位制數,確認為負數
轉換為十進位制:
-1
11111111 11111111 11111111 11111000
取反
00000000 00000000 00000000 00000111 --> 7
加符號-為:-7
得到:~6 = -7

8 證明為什麼byte型別的取值範圍為-128到127

byte型別,佔1位元組,8位,去掉符號位,只有7位可用,取值範圍為2的7次方,即:

127 :01111111

-128: 10000000

10000000
-1
01111111
取反
10000000 -->2的7次方=128
加符號-為:-128