JAVA位運算子<<,>>,>>>,&,|,^,~(第7節)
阿新 • • 發佈:2022-01-04
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