標籤:
位元運算是直接對二進位進行運算的。
<< 左移 3<<2 –> 3*2*2 像左移動兩位。實則*2*2
3: 0000 0011
左移兩位 0000 1100
>> 右移 3>>2 –> 3/2/2 實則/2/2
3: 0000 0011
右移兩位 0000 0000
有符號的右移時候,最高位是0的用0補,最高位是1的用1補。
-3 >> 2
-3 1000 0000 0000 0000 0000 0000 0000 0011 原碼 1111 1111 1111 1111 1111 1111 1111 1100反碼 1111 1111 1111 1111 1111 1111 1111 1101 補碼
右移兩位 11 1111 1111 1111 1111 1111 1111 1111 11 (01丟失)補碼 1111 1111 1111 1111 1111 1111 1111 1111 1110 反碼 1000 0000 0000 0000 0000 0000 0000 0001 結果為-1
>>> 無符號的右移運算
-3 >>> 2
-3 1000 0000 0000 0000 0000 0000 0000 0011 原碼 1111 1111 1111 1111 1111 1111 1111 1100 反碼 1111 1111 1111 1111 1111 1111 1111 1101 補碼
右移兩位 00 1111 1111 1111 1111 1111 1111 1111 11 (01丟失)結果為1073741823
注意在java中 整數預設用int儲存 所以是4位元組。
&與運算 二進位碼的與運算
|或運算、 二進位碼的或運算
^異或運算 二進位碼的異或運算
~反碼
12&5
12的原碼(高位為0不寫)
12 0000 1100
5 0000 0101
& 0000 0100
結果 4
12|5
12 0000 1100
5 0000 0101
| 0000 1101
結果 13
12^5
12 0000 1100
5 0000 0101
^ 0000 1001
結果 9
~12
12 0000 0000 0000 0000 0000 0000 0000 1100
~ 1111 1111 1111 1111 1111 1111 1111 0011 (符號位改變 負數補碼)
1111 1111 1111 1111 1111 1111 1111 0010 (反碼)
1000 0000 0000 0000 0000 0000 0000 1101 (原碼)
結果:-13
int m =5;
int n = 3
m = m^n;
n = m^n;
m = m^n;
m = m^n
n = m ^ n = (m ^ n) ^n = m =5
m = m ^n = (m ^ n) ^n = n = 3
5 0000 0101
3 0000 0011
^ 0000 0110 6
3 0000 0011
^ 0000 0101 5
java個人學習筆記:位元運算符