【发布时间】:2019-12-11 13:08:04
【问题描述】:
我有两个二进制数
01110
和
10010
很容易看出,它们不同的第一个位置是右数第三个。我如何在 python 中找到它?比方说,我会有类似sdb(a, b) 的东西,在这种情况下会返回 3。有没有比使用 leftshift 从右边循环遍历 2 个数字位更好的选择?
【问题讨论】:
标签: python python-3.x bit-manipulation bit
我有两个二进制数
01110
和
10010
很容易看出,它们不同的第一个位置是右数第三个。我如何在 python 中找到它?比方说,我会有类似sdb(a, b) 的东西,在这种情况下会返回 3。有没有比使用 leftshift 从右边循环遍历 2 个数字位更好的选择?
【问题讨论】:
标签: python python-3.x bit-manipulation bit
您可以XOR 这两个数字,当两个位相同时 XOR 将返回 0,当两个位不同时返回 1。因此01110 ^ 10010 的结果将是11100,然后我们可以使用 rindex 将其解析为字符串,以查找我们从右侧遇到的第一个1,因为这将是位不同的第一个位置。这将为我们提供左侧的索引。然后我们从 xor 字符串的长度中减去它,以从发生差异的右侧获取位计数。
def sdb(a: int, b: int) -> int:
try:
xor_string = f'{a^b:b}'
index = len(xor_string) - xor_string.rindex('1')
except ValueError as ve:
#if no bits are different return index 0
index = 0
return index
num1 = int('01110',2)
num2 = int('10010',2)
print(sdb(num1, num2))
【讨论】: