1、運算符號
含義 | Java | 運算規則 |
---|---|---|
按位與 | a & b | 兩個位都爲1時,結果才爲1 |
按位或 | a | b | 兩個位都爲0時,結果才爲0 |
按位異或 | a ^ b | 兩個位相同爲0,相異爲1 |
按位取反 | ~a | 0變1,1變0 |
左移 | a << b | 各二進位全部左移若干位,高位丟棄,低位補0 |
帶符號右移 | a >> b | 各二進位全部右移若干位,若正數,高位補0,若負數,高位補1 |
無符號右移 | a>>> b | 各二進位全部右移若干位,不論正負,高位均補0 |
2、運算規則
2.1、補碼
(1)正整數的補碼和原碼相同;
(2)負整數的補碼,將其原碼除符號位外的所有位取反(0變1,1變0,符號位爲1不變)後加1。
要將十進制的-10用二進制表示,先將10用二進制表示:
0000 0000 0000 0000 0000 0000 0000 1010
取反:
1111 1111 1111 1111 1111 1111 1111 0101
加1:
1111 1111 1111 1111 1111 1111 1111 0110
所以,-10的二進制表示就是:1111 1111 1111 1111 1111 1111 1111 0110
2.2、按位與(&)
參加運算的兩個數,換算爲二進制(0、1)後,進行與運算。只有當相應位上的數都是1時,該位才取1,否則該爲爲0。
將10與-10進行按位與(&)運算:
0000 0000 0000 0000 0000 0000 0000 1010
1111 1111 1111 1111 1111 1111 1111 0110
-----------------------
0000 0000 0000 0000 0000 0000 0000 1010
所以:10 & -10 = 0000 0000 0000 0000 0000 0000 0000 1010
2.3、按位或(|)
參加運算的兩個數,換算爲二進制(0、1)後,進行或運算。只要相應位上存在1,那麼該位就取1,均不爲1,即爲0。
將10與-10進行按位或(|)運算:
0000 0000 0000 0000 0000 0000 0000 1010
1111 1111 1111 1111 1111 1111 1111 0110
-----------------------
1111 1111 1111 1111 1111 1111 1111 1110
所以:10 | -10 = 1111 1111 1111 1111 1111 1111 1111 1110
2.4、按位異或(^)
參加運算的兩個數,換算爲二進制(0、1)後,進行異或運算。只有當相應位上的數字不相同時,該爲才取1,若相同,即爲0。
將10與-10進行按位異或(^)運算:
0000 0000 0000 0000 0000 0000 0000 1010
1111 1111 1111 1111 1111 1111 1111 0110
-----------------------
1111 1111 1111 1111 1111 1111 1111 1100
所以:10 ^ -10 = 1111 1111 1111 1111 1111 1111 1111 1100
可以看出,任何數與0異或,結果都是其本身。利用異或還可以實現一個很好的交換算法,用於交換兩個數,算法如下:
a = a ^ b;
b = b ^ a;
a = a ^ b;
2.5、取反(~)
參加運算的兩個數,換算爲二進制(0、1)後,進行取反運算。每個位上都取相反值,1變成0,0變成1。
對10進行取反(~)運算:
0000 0000 0000 0000 0000 0000 0000 1010
---------------------
1111 1111 1111 1111 1111 1111 1111 0101
所以:~10 = 1111 1111 1111 1111 1111 1111 1111 0101
2.6、左移(<<)
參加運算的兩個數,換算爲二進制(0、1)後,進行左移運算,用來將一個數各二進制位全部向左移動若干位。
正整數:對10左移2位(就相當於在右邊加2個0):
0000 0000 0000 0000 0000 0000 0000 1010
--------------------
0000 0000 0000 0000 0000 0000 0010 1000
所以:10 << 2 = 0000 0000 0000 0000 0000 0000 0010 1000 = 40
負整數:對-10左移2位(就相當於在右邊加2個0):
1111 1111 1111 1111 1111 1111 1111 0110
--------------------
1111 1111 1111 1111 1111 1111 1101 1000
所以:-10 << 2 = 1111 1111 1111 1111 1111 1111 1101 1000 = -40
注意,觀察可以發現,左移一位的結果就是原值乘2,左移兩位的結果就是原值乘4。
2.7、右移(>>)
參加運算的兩個數,換算爲二進制(0、1)後,進行右移運算,用來將一個數各二進制位全部向右移動若干位,若正數,高位補0,負數,高位補1。
正整數:對10右移2位(就相當於在左邊加2個0):
0000 0000 0000 0000 0000 0000 0000 1010
--------------------
0000 0000 0000 0000 0000 0000 0000 0010
所以:10 >> 2 = 0000 0000 0000 0000 0000 0000 0000 0010 = 2
負整數:對-10右移2位(就相當於在左邊加2個1):
1111 1111 1111 1111 1111 1111 1111 0110
--------------------
1111 1111 1111 1111 1111 1111 1111 1101
所以:-10>>2=1111 1111 1111 1111 1111 1111 1111 1101 = -3
注意,觀察可以發現,右移一位的結果就是原值除2,左移兩位的結果就是原值除4,注意,除了以後沒有小數位的,都是取整。
2.8、無符號右移(>>>)
參加運算的兩個數,換算爲二進制(0、1)後,進行右移運算,用來將一個數各二進制位全部向右移動若干位,不論正負,高位均補0。
正整數:對10右移2位(就相當於在左邊加2個0):
0000 0000 0000 0000 0000 0000 0000 1010
--------------------
0000 0000 0000 0000 0000 0000 0000 0010
所以:10 >>> 2 = 0000 0000 0000 0000 0000 0000 0000 0010 = 2
負整數:對-10右移2位(就相當於在左邊加2個0):
1111 1111 1111 1111 1111 1111 1111 0110
--------------------
0011 1111 1111 1111 1111 1111 1111 1101
所以:-10 >>> 2 = 0011 1111 1111 1111 1111 1111 1111 1101 = 1073741821