位運算子通常在圖形、影象處理和建立裝置驅動等底層開發中使用。使用位運算子可以直接運算元值的原始 bit 位,尤其是在使用自定義的協議進行通訊時,使用位運算子對原始資料進行編碼和解碼也非常有效。
位運算子對於初學者來說有些難度,因此初學者可先跳過本節內容。
python 支援的位運算子有如下 6 個:
位運算子的運算法則如表 1 所示:
表 1 位運算子的運算法則
第乙個運算元
第二個運算元
按位與按位或
按位異或00
0000
1011
1001
1111
10按位非只需要乙個運算元,這個運算子將把運算元在計算機底層的二進位製碼按位取反。如下**測試了按位與和按位或的執行結果:
# 將輸出1 print(5 & 9) # 將輸出13 print(5 | 9)程式執行的結果是:5&9 的結果是 1,5|9 的結果是 13。下面介紹運算過程。
5 的二進位製碼是 00000101(省略了前面的 24 個 0),而 9 的二進位製碼是 00001001(省略了前面的 24 個 0)。運算過程如圖 2 所示:
圖 2 按位與和按位或的運算過程
下面是按位取反和按位異或的執行**:
a = -5 # 將輸出4 print( ~a) # 將輸出12 print(5 ^ 9)程式執行 ~-5 的結果是 4,執行 5^9 的結果是 12。下面通過圖 3 來介紹 ~-5 的運算過程:
圖 3 ~-5的運算過程(點此檢視高畫質大圖)
上面的運算過程涉及與計算機儲存相關的內容。首先我們要明白:所有數值在計算機底層都是以二進位制形式存在的,原碼是直接將乙個數值換算成二進位制數。有符號整數的最高位是符號位,符號位為 0 代表正數,符號位為 1 代表負數。無符號整數則沒有符號位,因此無符號整數只能表示 0 和正數。
為了方便計算,計算機底層以補碼的形式儲存所有的整數。補碼的計算規則是:正數的補碼和原碼完全相同,負數的補碼是其反碼 +1;反碼是對原碼按位取反,只是最高位(符號位)保持不變。
5 ^ 9 進行的是異或運算,運算過程如圖 4 所示。
圖 4 5 ^ 9 的運算過程
左移運算子是將運算元的二進位製碼整體左移指定位數,左移後右邊空出來的位以 0 來填充。例如如下**:
# 輸出20 print(5 << 2) # 輸出-20 print(-5 << 2)圖 5 示範了 -5 左移兩位的運算過程。
圖 5 -5 左移兩位的運算過程
在圖 5 中,上面的 32 位數是 -5 的補碼,左移兩位後得到乙個二進位制補碼,這個二進位制補碼的最高位是 1,表明是乙個負數,換算成十進位制數就是 -20。
python 的右移運算子為:>>。對於「>>」運算子而言,把第乙個運算元的二進位製碼右移指定位數後,左邊空出來的位以原來的符號位來填充。即如果第乙個運算元原來是正數,則左邊補 0;如果第乙個運算元是負數,則左邊補 1。
請看下面**:
b = -5 # 輸出-2 print(b >> 2)圖 6 給出了-5 >> 2 的運算過程。
圖 6 -5>>2 的運算過程
從圖 6 來看,-5 右移兩位後左邊空出兩位,空出來的兩位以符號位來填充。從圖 6 可以看出,右移運算後得到的結果的正負與第乙個運算元的正負相同。右移後的結果依然是乙個負數,這是乙個二進位制補碼,換算成十進位制數就是 -2。
必須指出的是,位移運算子只適合對整型數進行運算。
在進行位移運算時,不難發現,左移 n 位就相當於來以 2 的 n 次方,右移 n 位則相當於除以 2 的 n 次方(如果不能整除,實際返回的結果是小於除得結果數值的最大整數的)。不僅如此,進行位移運算只是得到了乙個新的運算結果,而原來的運算元本身是不會改變的。
python運算子 之位運算子
支援的資料型別有數字 集合 set 僅支援 交集 並集 不同集 其他型別都不支援位運算。按位運算子是把數字看作二進位制來計算的。位運算子作用於所有的位上,並且按位運算。python中按位運算法則如下 假設a 60,b 13 操作符描述例項 按位與運算子,當且僅當兩個運算元的某一位都非0時,該位的結果...
Python位運算子
按位運算子是把數字看作二進位制來進行計算的。python中的按位運算法則如下 下表中變數 a 為 60,b 為 13,二進位制格式如下 a 0011 1100 b 0000 1101 a b 0000 1100 a b 0011 1101 a b 0011 0001 a 1100 0011運算子 描...
python位運算子
python位運算子 python的位運算子是把數字看作二進位制來進行計算的。按位與 如果兩個二進位都為1,則該位結果為1,否則為0 按位或 只要乙個為1,則為1,否則為0 按位異或 兩個二進位相異為為1 即兩個二進位要相反 否則為0 取反 對資料的每個二進位制位取反,即把1變0,把0變1 左移動 ...