python 位運算 效能 Python位運算妙用

2021-10-19 20:25:18 字數 1622 閱讀 9680

位運算就是直接對整數在記憶體中的二進位制位進行操作,位運算的效能較高,常用的位運算包含按位與&,按位或|,按位非~,按位異或 ^,有符號左移<>。

如下是一些妙用的示例:

判斷奇偶

常用思路通過除以2,判斷餘數是否為0:

def isodd(x):

return true if (x % 2 <> 0) else false

如何使用位運算,我們只需要使用&運算,與1進行&,如果為1,那麼該數為奇數;如果為0,那麼該數是偶數,python**如下:

def isodd(x):

return true if (x & 1) else false

左移和右移

左移一次相當於乘以2,右移一次相當於除以2

a = 10

b = 20

a << =1

b >> =1

# a = 20

# b = 5

交換數值

常用思路如下:

tmp = b

b = a

a = tmp

異或運算的特性:任意數和自身異或結果為0;0和任意數異或結果還是其本身。 使用位運算則如下:

a ^= b

b ^= a

a ^= b

第一行,a = a ^ b,很容易理解;

第二行, b = b ^ a = b ^ a ^ b,由於 b ^ b = 0,所以 b = a ^ 0,即 b = a;

第三行, a = a ^ b ,由於a在第一步重新賦值,所以,a = a ^ b ^ a = b,完成了數值交換。

尋找資料列表中的獨一無二

有乙個資料列表(2n+1個整數),只有乙個數出現了1次,其餘n個數都出現了2次。如何找到這個獨一無二的資料?

看到這個題目,相信大家第一次想到的演算法肯定是計數,建立列表,迴圈整個資料並計數,然後遍歷這個列表找到出現次數為1的資料。

這樣,空間複雜度為o(n)。

如何降低空間複雜度呢?

注意看一下剛剛講過的異或的特性:任意數和自身異或結果為0;0和任意數異或結果還是其本身。

那麼,出現了2次的n個數異或的結果是0,再與出現次數為1次的數異或的結果即為該數。即:找到這個獨一無二資料的辦法是通過對全部的資料進行異或操作,空間複雜度降低為o(1)。

計算乙個數值的二進位制數中有多少個1

def number1bit(x):

count = 0

while x:

count = count + (x&1)

x = x >> 1

return count

這樣存在乙個問題,就是如果有連續多個0,那麼需要做多次移位操作。有沒有簡單的方式跳過連續多個0的情況?

那就是通過與(x-1)進行&運算。這裡可能不太好理解,舉例說明一下

x 1110 0000

x - 1 1101 1111

x&(x-1) 1100 0000

通過這種方式,會把最後的那個1檢測出來。

python**實現如下:

def number1bit(x):

count = 0

while x:

count = count + 1

x = x & (x-1)

return count

python位運算基礎

位與 位或 位異或 左移 右移 求反作用 按位操作,兩個對應的位都為1,則結果為1,有乙個為0,則結果為0 示例 10 20 0b01010 0b10100 00000 bin x 函式 將x轉換為二進位制的字串 ps 有點像數學中的 作用 按位操作,兩個對應的位只要有乙個為1,則結果為1,否則為0...

python之位運算

位運算,計算機內所有的數都以二進位制儲存,位運算就是對二進位制位的操作 位運算子 說明 按位左移,左移n位相當於乘以2的n次方 按位右移 左移n位相當於除以2的n次方 按位與,二進位制位數同且為1結果位為1 l按位或 二進位制位數或有1結果位為1 按位異或 二進位制位數不同結果位為1 按位取反,二進...

python入門 位運算

二進位制有三種表示形式,分別是原碼 反碼和補碼,計算機內部使用補碼來表示。原碼 就是二進位制表示 注意 第一位是符號位 3 10000011 3 00000011 反碼 正數的反碼就是原碼,負數的反碼是符號位不變,其餘位取反 3 11111100 3 00000011 補碼 正數的補碼就是原碼,負數...