前言:
符號 | 描述 | 運算規則 |
---|---|---|
& | 與 | 同爲1時,結果爲1 |
| | 或 | 同爲0時,結果爲0 |
^ | 異或 | 相同爲0,不同爲1 |
<< | 左移 | 各二進位全部左移若干位,高位丟棄,低位補0 |
>> | 右移 | 各二進位全部右移若干位,低位丟失,高位補0 |
~ | 取反 | 0變1,1變0 |
一、與運算符(&)
運算規則:
同爲1的時候結果爲1,不同的時候結果爲0,同爲0的時候也爲0
0 + 0 = 0
0 + 1 = 0
1 + 0 = 0
1 + 1 = 1
例如:3 & 4
3(0000 0011)
4(0000 0100)
-------------
0(0000 0000)
二、或運算符(|)
運算規則:
同爲0的時候結果爲0,同爲1的時候結果爲1,不相同的時候結果爲1(只有同爲0的時候結果才爲0,其他情況都爲1,只要出現1結果就爲1)
0 + 0 = 0
0 + 1 = 1
1 + 0 = 1
1 + 1 = 1
例如: 3 | 4
3(0000 0011)
4(0000 0100)
-------------
7(0000 0111)
三、異或運算符(^)
運算規則:
同爲0,不同爲1
0 + 0 = 0
0 + 1 = 1
1 + 0 = 1
1 + 1 = 0
注意:
異或運算不管0還是1,只要遇到相同的就爲0,只要遇到不相同就爲1
例如:3 ^ 4
3(0000 0011)
4(0000 0100)
-------------
7(0000 0111)
特例:
異或運算還可以做用於兩個數的交換
公式:
a = a ^ b
b = a ^ b
a = a ^ b
舉例:
1、定義兩個數值性常量a,b
2、a = 3
3、b = 5
4、交換a,b的值
5、輸出a,b交換後的結果
步驟一:a = a ^ b
a = a ^ b
a = 3 ^ 5
a = 6
a(0000 0011) = 3
b(0000 0101) = 5
-------------
a(0000 0110) = 6
步驟二:b = a ^ b
b = a ^ b
b = 6 ^ 5
b = 3
a(0000 0110) = 6
b(0000 0101) = 5
------------------
b(0000 0011) = 3
步驟三:a = a ^ b
a = a ^ b
a = 6 ^ 3
a = 5
a(0000 0110) = 6
b(0000 0011) = 3
------------------
a(0000 0101) = 5
步驟四: 輸出a,b
的值
a = 5
b = 3
第四、左移運算符(<<)
運算規則:
1、左移可看作 整數M乘以2的N次方
2、"<<"右邊的數字就是N,左邊的數字就表示這個整數M
注意:
移動的數字必須是整數
例如:
二進制移位:3 << 4
3(0000 0011)待移位的數字
6(0000 0110)左移第一位,左移一位之後,最右邊的將會缺失,所以不足位數,補一位0,最左邊將會多出一位,所以舍掉一位
12(0000 1100)左移第二位,最右邊再補一位0,最左邊再舍掉一位
24(0001 1000)左移第三位,最右邊再補一位0,最左邊再舍掉一位
48(0011 0000)左移第四位,最右邊再補一位0,最左邊再舍掉一位
乘法運算:3 << 4
= 3 * 2⁴
= 3 * 16
= 48
第五、右移運算符(>>)
1、右移可看作 整數M除以2的N次方
2、"<<"右邊的數字就是N,左邊的數字就表示這個整數M
注意:
1、移動的數字必須數整數
2、右移之後的數字還是整數,不能得到浮點型數值,不能被2的N次方整數的數字,將會丟失精度,得到的結果只會保留整數部分,小數部分會被自動舍掉
例如:
二進制移位:8 >> 2
8(0000 1000)待右移的數字
4(0000 0100)右移第一位,最左邊將會缺失一位,不足位數補一位0,最右邊將會多出一位,所以舍掉最右邊的一位
2(0000 0010)右移第二位,最左邊再補一位0,最右邊再舍掉一位
除法運算:8 >> 2
= 8 / 2²
= 8 / 4
= 2
第六、換位取反運算符(~)
備註:
換位取反比較複雜,目前對於計算機存儲負值的情況還不是很明確,這裏從網絡上找到一個獲得取反的公式,這個公式我親測過,得到的結果時正確的,這裏不做過多的講解,這塊以後弄明白了之後再做補充
~a = -(a + 1)
運算規則:
1、遇到0時,結果爲1
2、遇到1時,結果爲0
參考:
換位取反運算符其他大咖的解讀思路