由Python位運算到原碼反碼補碼

2021-08-15 13:22:40 字數 2523 閱讀 1292

採用書籍python核心程式設計(第二版),人民郵電出版社,2023年7月第1版。本書以python2.5為主,但筆記主要以python3.6為主。

python支援標準位運算,位運算操作符只能用於整數。操作符如下:

操作符意義

舉例操作符

意義舉例

~按位取反~5&

按位與5&6

|按位或

5|6^

按位異或

5^6<<

左移m位

5<<1

>>

右移6>>1

原碼反碼補碼的一般說法:

原碼:原碼是二進位制數字的一種簡單的表示法。二進位制首位為符號位,1代表負,0代表正。

反碼:反碼可由原碼得到。如果是正數,反碼與原碼相同;如果是負數,反碼是其原碼(符號位除外)各位取反而得到的。

補碼:補碼可由原碼得到。如果是正數,補碼與原碼相同;如果是負數,補碼是對其原碼(除符號位外)各位取反,並在末位加1而得到的(有進製則進製,但不改變符號位)。

但是為什麼會有原碼、反碼、補碼呢?簡單來說,原碼是為了方便人計算,補碼是方便計算機計算,而反碼是認為提出的乙個中間橋梁。參考這篇文章:原碼、反碼和補碼,總結幾點:

計算機裡面,只有加法器,沒有減法器,所有的減法運算,都必須用加法進行。

用補數代替原數,可把減法轉變為加法。出現的進製就是模,此時的進製,就應該忽略不計。

二進位制下,有多少位數參加運算,模就是在 1 的後面加上多少個 0。

補碼就是按照這個要求來定義的:正數不變,負數即用模減去絕對值。

舉例:以10為模,6的補碼是6,-6的補碼是4。9-6=9+(-6)=9+(10-6)=9+4=13,13%10=3,結果為3,完全正確!

舉例:8位二進位制的模是100000000,3的補碼是00000011,-3的補碼是11111100(100000000-00000011)。

以 8 位二進位制舉幾個簡單例子:

整數原碼

反碼補碼27

−1=12727

−1

=127

01111111

01111111

01111111

+700000111

00000111

00000111

+100000001

00000001

00000001

+0(同0)

00000000(同0)

00000000(同0)

00000000(同0)

000000000

00000000

00000000

-0(錯誤)

10000000(錯誤)

11111111(錯誤)

10000000(錯誤)

-110000001

11111110

11111111

-710000111

11111000

11111001−(

27−1

)=−127−(

27−1

)=

−127

11111111

10000000

10000001

**有兩個錯誤表示:+0和-0,但是給 0 加正負號根本沒有意義。我們不會討論 +0 或 -0 的原碼反碼和補碼,因為這二者本來就是 0。所以,0(包括+0、-0)的原碼反碼和補碼都是00000000

數字在計算機中用二進位制補碼形式表示,補碼10000000表示的不是-0,而是-128。用參考資料中的「模理論」來說明,-128的補碼的計算方法:模的二進位制-絕對值的二進位制(100000000-10000000)=10000000。

數字在計算機中是以補碼儲存的,所以用python位運算作用在補碼上,每一位都參與運算:

按位取反~:按位取反後得到二進位制表示,把該二進位制看成乙個新的補碼,返回該補碼對應的數字結果。

按位與&,或|,異或^:同取反~

左移《和右移》:左移和右移n位等同於無溢位檢查(忽略溢位)的n次冪運算2**n。對長整型來說,位操作符使用一種修改的二進位制補碼形式,使得符號位可以無限向左擴充套件。也就是說,向左移位不會溢位。

python位運算舉例:

>>> ~7

# 解釋:7的補碼是00000111 對補碼取反得到11111000 該補碼對應的整數為-8

-8>>> ~-7

# 解釋:-7的補碼是11111001 對補碼取反得到00000110 該補碼對應的整數為6

6>>>

6 & 5

4>>>

5 & 4

4>>>

7<< 2

28>>>

28<< 2

112

【補充1】原碼到反碼再到補碼的計算很簡單,但是補碼如何變回到原碼呢?

【補充2】整數的二進位製用二進位制補碼形式表示,那浮點數呢?

原碼 補碼 反碼以及位運算

2 位運算 機器數是乙個數在計算機中的二進位制表示形式,機器數是帶符號的,在計算機中用乙個數的最高位 第一位 存放符號,正數為0,負數為1。例如1 帶符號即 1 在計算機中的最終表示形式為 0000 0001,依此類推 1的二進位制為 1000 0001。這種表示方式又叫做原碼,其中0的原碼為000...

位運算子,原碼 反碼 補碼

按位運算就把數字轉換為機器語言 二進位制的數字來運算的一種運算形式。按位與運算子 參與運算的兩個值,如果兩個相應位都為1,則該位的結果為1,否則為0 按位或運算子 參與運算的兩個值,只要其中有乙個為1,則該位結果就為1 按位異或運算子 當兩個對應的二進位相異時,結果為1 按位取反運算子 對資料的每個...

運算(原碼 補碼 反碼)

表示不帶符號向右移動二進位制數,移動後前面統統補0 兩個箭頭表示帶符號移動,沒有 這種運算子,因為左移都是補零,沒有正負數的區別。如 12 的二進位制為 1111 1111 1111 1111 1111 1111 1111 0100 12 3 即帶符號右移3位,結果是 1111 1111 1111 ...