1. 程式人生 > 實用技巧 >Python刷題:常用二進位制操作

Python刷題:常用二進位制操作

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程式設計師面試寶典》。