我有两个数字(二进制或不二进制,不起任何作用),它们只有一位不同,例如: (伪代码)
a = 11111111
b = 11011111
我想要一个简单的python函数,它返回不同的位位置(给定示例中的“5”,从右到左看)。我的解决方案是(python)
math.log(abs(a-b))/math.log(2)
但我想知道是否有更优雅的方法来做到这一点(不使用花车等)。
由于 亚历
答案 0 :(得分:6)
您可以使用二进制独占:
a = 0b11111111
b = 0b11011111
diff = a^b # 0b100000
diff.bit_length()-1 # 5 (the first position (backwards) which differs, 0 if a==b )
答案 1 :(得分:0)
不使用按位操作,您可以执行以下操作:
In [1]: def difbit(a, b):
...: if a == b: return None
...: i = 0
...: while a%2 == b%2:
...: i += 1
...: a //= 2
...: b //= 2
...: return i
...:
In [2]: difbit(0b11111111, 0b11011111)
Out[2]: 5
答案 2 :(得分:0)
除非我遗漏了某些东西......
这应该有效:
>>> def find_bit(a,b):
a = a[::-1]
b = b[::-1]
for i in xrange(len(a)):
if a[i] != b[i]:
return i
return None
>>> a = "11111111"
>>> b = "11011111"
>>> find_bit(a,b)
5
可能不那么优雅,但它易于理解,并且它完成了工作。
答案 3 :(得分:0)
使用(a^b).bit_length()-1
非常适合只有一个差异位的数字。 EX:
a = 1000000
b = 1000001
(a^b).bit_length()-1
Output: 0
但是对于具有多个差异位的数字,它给出了最左边的差分位的索引。 EX:
a = 111111111111111111111111111111
b = 111111110111011111111111111111
c = a^b # 1000100000000000000000
c.bit_length()-1
Output: 21 # Instead of 17. 21 is the left most difference bit
因此,要解决此问题,我们需要隔离最右边的设置位,然后获取其索引。因此,使用((a^b) & (-(a^b))).bit_length()-1
最适合所有输入:
c = (a^b) & (-(a^b)) # 100000000000000000 - Isolates the rightmost set bit
c.bit_length()-1
Output: 17
(a^b) & (-(a^b))).bit_length()-1
Output: 17
了解从here
隔离最右边的设置位