题目描述:在不使用第三个变量的前提下使用二进制的方式互换两个整型变量的值。
解题代码:python
>>> a = 1234 >>> b = 5678 >>> a = a ^ b >>> b = a ^ b >>> a = a ^ b >>> print(a, b) 5678 1234
总结:互换两个变量的值其实在Python中也能够很简单,好比a, b = b, a
,可是,若是要使用二进制的方式来进行操做的话,能够利用“异或”操做的特性,从这个算法也能够获得“异或”操做这样一个特性:两个整型值“异或”能够获得一个中间值,这个中间值和原先的任何一个值再次进行“异或”操做就能够获得另外一个变量的值。程序员
题目描述:对于一个整型值,在二进制表示中,将其最低位的1变为0,其余位置的值不变。
解题代码:面试
>>> x = 124 >>> bin(x) '0b1111100' >>> bin(x&(x-1)) '0b1111000'
总结:这也是一个经常使用的二进制操做,使用公式x&(x-1)
便可,&
为二进制的“与”操做。算法
题目描述:对于一个整型值,在二进制表示中,只保留最低位的1,其他位置的值所有变为0。
解题代码:code
>>> x = 86 >>> bin(x) '0b1010110' >>> bin(x&~(x-1)) '0b10'
总结:这也是一个经常使用的二进制操做,使用公式x&~(x-1)
便可,$
为二进制的“与”操做,~
为二进制的“取反”操做。it
题目描述:对于一个整型值,在二进制表示中,交换指定位置的两个比特位的值。
解题代码: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程序员面试宝典》。书籍