python位運算

什麼是位運算

位運算就是把數字當成二進制來進行計算,位運算有六種:&(與), |(或), ^(異或), ~(非), <<(左移), >>(右移)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

a----0101

b----1001

a|b--1101

a|b=11

<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),向右移位能夠代替除法運算

相關文章
相關標籤/搜索