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程序员面试宝典》。