python的按位運算

2021-07-03 23:16:48 字數 1402 閱讀 1379

華電北風吹

天津大學認知科學與計算重點實驗室

最後修改日期:2015/8/6

python提供了豐富的位運算操作符,例如按位與,按位或,按位異或,左移位,右移位和取反操作,例子**如下

>>> a,b=45,83

>>> bin(a),bin(b)

('0b101101', '0b1010011')

>>> a|b,bin(a|b)

(127, '0b1111111')

>>> a^b,bin(a^b)

(126, '0b1111110')

>>> a&b,bin(a&b)

(1, '0b1')

>>> a

<<3,bin(a

<<3)

(360, '0b101101000')

>>> a>>3,bin(a>>3)

(5, '0b101')

>>> ~a,bin(~a)

(-46, '-0b101110')

按位與,按位或,按位異或,左移位,右移位這幾個跟以前理解的沒啥區別,就乙個高位補零

下面主要解釋一下取反操作

變數a的二進位制編碼為』0b101101』,取反操作後卻變為』-0b101110』,最大變化由正數變為負數,而不是期望的按每一位取反』0b010010』,這個主要是由於計算機對於整數二進位制編碼引起的。

整數在計算機中的儲存格式有最高位的標誌位和低位的數值絕對值位。整數的絕對值位就是本身,而負數儲存的是他的補碼。

現在回歸到(~a)執行過程上來,python在執行取反操作的時候確實是按照每一位進行取反了,不過他把標誌位也給取反了,然後編譯器認為這是乙個負數,所以在解析的時候就按照按位取反得到補碼,然後根據補碼解析原碼的過程解析。

bin(a)=』0b101101』

按位取反得到負數:』-0b010010』

解析負數:

得到反碼:』-0b101101』 (除標誌位,按位取反)

得到補碼:』-0b101110』 (絕對值位+1)

驗證過程如下

>>> a=45

>>> ~a

-46>>> int('-0b101110',2)

-46>>> bin(-46)

'-0b101110'

這裡需要注意的一點就是bin是解析二進位制字串;~是對記憶體的01操作,不考慮補位儲存

理解了以上以後可以看乙個更一般的例子

>>> -1&-5

-5

因為-1二進位制編碼為1+00001,補碼(記憶體編碼):1+11111,-5二進位制編碼1+00101,補碼(記憶體編碼):1+11011,兩個負數記憶體編碼按位取與,得到1+11011,對應的補碼即為1+00101,二進位制對應的即為-5

神奇的按位運算 python

先來看leetcode 29上的divide two integers題目要求 divide two integers without using multiplication,division and mod operator.if it is overflow,return max int.就是...

python中的按位運算

常見的按位運算有 按位與運算 print 5 0xf print 5 0xf 結果為 115由上可知 python中進行按位與運算結果必然是正數,最高位是符號位的特質消失。主要是限定變數的位數 因為python中沒有int long來限制位數 按位或運算 print 5 0xf print 5 0x...

python 中的按位運算

1 按位運算子是把數字看作二進位制來進行計算的。python 的內建函式 bin 可已將乙個整數數值轉換成相應的二進位制值。示例 2 按位與 參與運算的兩個值,如果其二進位制值對應位都為1,則該位的結果為1,否則該位為 0 示例 3 按位或 只要對應的二個二進位有乙個為 1 時,結果位就為 1,只有...