華電北風吹
天津大學認知科學與計算重點實驗室
最後修改日期: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 中按原碼取反 按位取反
在python中,按位運算的結果與c c 中位運算結果不同,原因主要是c c 是按原碼來取反。而在python中,取反的運算的流程是這樣的 先獲得其二進位制 原碼 進行取反操作。將第一步的結果,當作補碼。求這個補碼的原碼,這個原碼就是輸出的結果。補 碼求原碼的過程,先減1,再取反。由於是這樣的邏輯,...
按位取反符
二進位制數在記憶體中以補碼的形式儲存。按位取反 二進位制每一位取反,0變1,1變0。9的計算步驟 轉二進位制 0 1001 計算補碼 0 1001 按位取反 1 0110 轉為原碼 按位取反 1 1001 末位加一 1 1010 符號位為1是負數,即 10 var x 10 在計算機中乙個整型數4位...
按位取反 100 101
首先看等號左邊 100 的二進位制表示為 0110 0100 按位取反的意思就是每一位取反,0變1,1變0 所以 100 的二進位制表示為 1001 1011 所以等號左邊 1001 1011 再看右邊 101.一旦看到出現負數,那麼這個數一定是按有符號數的規則來表示的。乙個二進位制數 按位取反並加...