C語言中文網 目錄

Python位運算符詳解

位運算符通常在圖形、圖像處理和創建設備驅動等底層開發中使用。使用位運算符可以直接操作數值的原始 bit 位,尤其是在使用自定義的協議進行通信時,使用位運算符對原始數據進行編碼和解碼也非常有效。

位運算符對于初學者來說有些難度,因此初學者可先跳過本節內容。

Python 支持的位運算符有如下 6 個:
  • &:按位與。
  • |:按位或。
  • ^:按位異或。
  • ~:按位取反。
  • <<:左位移運算符。
  • >>:右位移運算符。

位運算符的運算法則如表 1 所示:

表 1 位運算符的運算法則
第一個操作數 第二個操作數 按位與 按位或 按位異或
0 0 0 0 0
0 1 0 1 1
1 0 0 1 1
1 1 1 1 0

按位非只需要一個操作數,這個運算符將把操作數在計算機底層的二進制碼按位取反。如下代碼測試了按位與和按位或的運行結果:
# 將輸出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 次方(如果不能整除,實際返回的結果是小于除得結果數值的最大整數的)。不僅如此,進行位移運算只是得到了一個新的運算結果,而原來的操作數本身是不會改變的。

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo