位運算就是把數字當成二進制來進行計算,位運算有六種:&(與), |(或), ^(異或), ~(非), <<(左移), >>(右移)python
&運算規則:兩個位都爲1,結果爲1,不然爲0spa
# &(與) a = 3 b = 9 print(a & b) # a----0101 # b----1001 # a&b--0001 # a&b=1
<br> ## |(或) |運算規則:兩個位至少有一個爲1,結果爲1,不然爲0 ```python # |(或) a = 3 b = 9 print(a | b)code
<br> ## ^(異或) ^運算規則:兩個位不一樣,結果爲1,不然爲0 ```python # ^(異或) a = 3 b = 9 print(a ^ b) # a----0101 # b----1001 # a^b--1100 # a^b=10
<br> ## ~(非) ~運算規則:對全部位取反,1變成0,0變成1 ```python a = 5 print(~a)對象
猜猜結果是多少?是否是覺得是2,哈哈哈 看一下打印結果 ```python -6
what? 檢查下計算過程內存
# a----101 # ~a--010 # ~a=2
按照運算規則,沒錯啊get
這是爲何呢?其實,計算機中是以補碼的形式來進行計算的class
對於正數: <b><font color='#ff0000'>原碼=反碼=補碼</font></b>import
對於負數: <b><font color='#ff0000'>反碼=原碼的符號位不變,其他位取反;</font></b> <b><font color='#ff0000'>補碼=反碼+1</font></b>終端
使用sys.getsizeof能夠查看對象在內存空間佔用的大小二進制
import sys a = 5 print(sys.getsizeof(a)) # 28
說明a在內存中佔的位數是28
如今咱們來一步一步等推算~a a的二進制形式
0000 00000000 00000000 00000101
<br> 因爲運算是以補碼的形式進行,所以要將原碼轉化成補碼,因爲a爲整數,所以其補碼就等於原碼 ```python # a的補碼 0000 00000000 00000000 00000101
<br> 對a的補碼進行~運算,結果爲 ```python # 結果的補碼 1111 11111111 11111111 11111010
到這裏要注意了,計算機運算的時候是以補碼的形式,可是顯示到終端上仍是以原碼的形式,所以咱們要把結果再轉化回原碼 因爲結果爲負數(符號爲1),先把補碼轉化成反碼,反碼=補碼-1
# 結果的反碼 1111 11111111 11111111 11111001
再計算結果的原碼
# 結果的原碼 1000 00000000 00000000 00000110
再把結果的二進制轉化成十進制形式,符號爲1說明是負數,-(4+2)= -6,所以結果爲-6 上面的計算過程只是讓咱們對計算機如何進行位運算有一個認識,實際上對於任意數a,~a = -(a+1),根本不用手工轉化成二進制計算
<br> ## <<(左移位) <<的規則:運算數的各二進位所有左移若干位,由<< 右邊的數字指定了移動的位數,高位丟棄,低位補0。 ```python a = 9 print(a << 2) # 36
對於整數a,a<<n等效於 a*2**n,也就是說移位運算能夠替代乘法運算 <br> ## >>(右移位) '>>'的規則:運算數的各二進位所有右移若干位,>> 右邊的數字指定了移動的位數 ```python a = 9 print(a >> 2) # 2
對於整數a,a<<n等效於 int(a/2**n),向右移位能夠代替除法運算