[計算機]位運算符

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章