1. 變量值互換
題目描述:在不使用第三個變量的前提下使用二進制的方式互換兩個整型變量的值。
解題代碼:
>>> a = 1234
>>> b = 5678
>>> a = a ^ b
>>> b = a ^ b
>>> a = a ^ b
>>> print(a, b)
5678 1234
總結:互換兩個變量的值其實在Python中也可以很簡單,比如a, b = b, a
,但是,如果要使用二進制的方式來進行操作的話,可以利用“異或”操作的特性,從這個算法也可以得到“異或”操作這樣一個特性:兩個整型值“異或”可以得到一個中間值,這個中間值和原先的任何一個值再次進行“異或”操作就可以得到另一個變量的值。
2. 最低位的1清零
題目描述:對於一個整型值,在二進制表示中,將其最低位的1變為0,其他位置的值不變。
解題代碼:
>>> x = 124
>>> bin(x)
'0b1111100'
>>> bin(x&(x-1))
'0b1111000'
總結:這也是一個常用的二進制操作,使用公式x&(x-1)
即可,&
為二進制的“與”操作。
3. 獲取最低位的1
題目描述:對於一個整型值,在二進制表示中,只保留最低位的1,其余位置的值全部變為0。
解題代碼:
>>> x = 86
>>> bin(x)
'0b1010110'
>>> bin(x&~(x-1))
'0b10'
總結:這也是一個常用的二進制操作,使用公式x&~(x-1)
即可,$
為二進制的“與”操作,~
為二進制的“取反”操作。
4. 交換指定位置的兩個比特位
題目描述:對於一個整型值,在二進制表示中,交換指定位置的兩個比特位的值。
解題代碼:
def swap_bit(x, i, j):
# 如果第i位和第j位是相同的,則沒必要交換
if ((x >> i) & 1) != ((x >> j) & 1):
x ^= ((1 << i) | (1 << j))
return x
x = 0b0101
i = 0
j = 1
print(bin(swap_bit(x, i, j))) # 輸出:0b110
總結:這也是一個常用的二進制操作,使用公式x ^= ((1<<i) | (1<<j))
即可,^
為二進制的“異或操作”。
題目及解題算法來自:書籍《Python程序員面試寶典》。