位運算符,原碼、反碼、補碼

按位運算就把數字轉換爲機器語言->二進制的數字來運算的一種運算形式。html

& 按位與運算符:參與運算的兩個值,若是兩個相應位都爲1,則該位的結果爲1,不然爲0
| 按位或運算符:參與運算的兩個值,只要其中有一個爲1,則該位結果就爲1
^ 按位異或運算符:當兩個對應的二進位相異時,結果爲1
~ 按位取反運算符:對數據的每一個二進制位取反,即把1變爲0,把0變爲1。將二進制數+1以後乘以-1,即~x=-(x+1)
<< 左移動運算符:運算數的各二進位所有左移若干位,由"<<"右邊的數指定移動的位數,高位丟棄,低位補0
>> 右移動運算符:把">>"左邊的運算數的各二進位所有右移動若干位,">>"右邊的數指定移動的位數

只有按位取反運算符是單目運算符,其餘都是雙目運算符。python

a = 60  # 0011 1100
b = 13  # 0000 1101

print(a&b)
# 12
print(a|b)
# 61
print(a^b)
# 49

# 按位取反,1100 0011
print(~a)
# -61

# 向左移動兩位,1111 0000
print(a<<2)
# 240

# 向右移動兩位,0000 1111
print(a>>2)
# 15

計算機中的符號數有三種表示方法,三種表示方法均有符號位和數值位兩部分,符號位都是用0表示「正」,用1表示「負」。
在計算機系統中,數值一概用補碼來表示和存儲。.net

原碼: 正數轉化爲二進制,負數第一位取1。5=>0b101,1=>0b1,-1=>-0b1
1:0000 0001
-1:1000 0001
反碼: 正數的反碼與原碼相同,負數的反碼符號位不變其他按位取反
1:0000 0001
-1:1111 1110
補碼:正數的補碼與原碼相同,負數的補碼符號位不變其他按位取反後+1
1:0000 0001
-1:1111 1111
負數的表示方法
- 早期數字電路的CPU中的運算器實現了加法器,可是沒有減法器,減法要轉換成加法
- 負數在計算機中使用補碼存儲,-1的補碼爲 1111 1111
- 5-1 => 5+(-1)直覺上是0b101-0b1,其實計算機中是0b101+0b11111111,溢出位捨棄

5+(-1)兩個二進制數相加,逢2進1
0000 0101
1111 1111
---------
0000 0100
print(~12)
# -13

12:0000 1100
取反:1111 0011

# 反推
1111 0010
1000 1101
print(10^9)
# 3
0000 1010
0000 1001
---------
0000 0011
print(10^-9)
# -3

# -9的補碼
1000 1001
1111 0111

# 用-9的補碼與10的補碼進行抑或運算
0000 1010
1111 0111
---------
1111 1101

# 把獲得的補碼還原。反推,將上面的結果-1而後取反,符號位不變
1111 1100
1000 0011

參考:
http://www.runoob.com/python3/python3-basic-operators.html
https://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html
http://www.javashuo.com/article/p-epzgofdx-mc.htmlcode

相關文章
相關標籤/搜索