Python刷題:經常使用二進制操做

1. 變量值互換

題目描述:在不使用第三個變量的前提下使用二進制的方式互換兩個整型變量的值。
解題代碼:python

>>> 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。
解題代碼:code

>>> x = 86
>>> bin(x)
'0b1010110'
>>> bin(x&~(x-1))
'0b10'

總結:這也是一個經常使用的二進制操做,使用公式x&~(x-1)便可,$爲二進制的「與」操做,~爲二進制的「取反」操做。it

4. 交換指定位置的兩個比特位

題目描述:對於一個整型值,在二進制表示中,交換指定位置的兩個比特位的值。
解題代碼:class

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程序員面試寶典》。書籍

相關文章
相關標籤/搜索