Python 获取两个(二进制)数之间不同的位数

Python 获取两个(二进制)数之间不同的位数,python,math,binary,Python,Math,Binary,我有两个数字(二进制或非二进制,不起任何作用),它们只在一位上不同,例如(伪代码) 我想要一个简单的python函数,它返回不同的位位置(在给定的示例中,从右到左看为“5”)。我的解决方案是(python) 但我想知道是否有一种更优雅的方法来做到这一点(不使用浮动等) 谢谢 Alex如果不使用位运算,您可以执行以下操作: In [1]: def difbit(a, b): ...: if a == b: return None ...: i = 0 ...:

我有两个数字(二进制或非二进制,不起任何作用),它们只在一位上不同,例如(伪代码)

我想要一个简单的python函数,它返回不同的位位置(在给定的示例中,从右到左看为“5”)。我的解决方案是(python)

但我想知道是否有一种更优雅的方法来做到这一点(不使用浮动等)

谢谢
Alex

如果不使用位运算,您可以执行以下操作:

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

您可以使用二进制独占:

a = 0b11111111
b = 0b11011111

diff = a^b  # 0b100000
diff.bit_length()-1 # 5 (the first position (backwards) which differs, 0 if a==b )

除非我错过了什么

这应该起作用:

>>> 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
也许没有那么优雅,但它很容易理解,而且可以完成任务。

使用
(a^b)。bit_length()-1
非常适合于只有一个不同位的数字。例:

a = 1000000
b = 1000001
(a^b).bit_length()-1
Output: 0
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 = 1000000
b = 1000001
(a^b).bit_length()-1
Output: 0
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

了解如何从中隔离最右边的设置位

尝试使用按位异或而不是abs(a-b)使用
(a^b)。bit_length()-1
而不是字符串长度。(应适用于python2.7+)。单行解决方案是最好的。谢谢@我已经测试了我的答案的结果,它运行正常。