如何根据计数翻转数字的位

问题描述 投票:0回答:1

因此,根据 geeksforgeeks.org,在下面的 python scriptA 中,该脚本是告诉我将 a 转换为 b 时要翻转的位数,因此在复制计数结果后,我尝试创建自己的 python 脚本来测试这一点。因此,关于我自己的python脚本的摘要给出了一个计数和一个整数变量A,根据计数翻转位以获得与b相同的位,而无需在方程中使用b,仅使用计数和a,所以当我得到结果整数它与整数 b 不同,所以我修改了脚本并再次尝试,但它仍然没有任何帮助 脚本A

if __name__ == '__main__':
    a = 10
    b = 20
    # Function call
    # Converting int to binary and counting number of bits
    result = bin(a ^ b).count("1")
    print(result)

结果数为 4

所以我制作了我的脚本,但它不起作用,所以任何人都可以创建一个可以帮助我的 python 脚本,非常感谢 这就是我的脚本

def flip_bits_to_match_count(a, count, b):
    flipped_a = a
    flips = 0
    while bin(flipped_a).count("1") != count:
        flipped_a ^= 1 << flips
        flips += 1
    return flipped_a == b


a = 10
count = 4
b = 20

matched = flip_bits_to_match_count(a, count, b)
print("Does the flipped 'a' match 'b'?", matched)

结果 A 是 53 而不是 20 这是我的问题抱歉我没有早点发布

python count integer bit-manipulation bit
1个回答
0
投票

您遇到的问题是结果告诉您需要翻转多少位,但不告诉您哪些位。没有办法用这个数字来展开 A 以获得 B。

但在某种程度上它要简单得多,因为使用 EXOR(异或)——这就是你在执行 a^b 时所做的事情,生成一个数字,其中每个二进制位告诉你是否翻转 a 中的一位来给出你就是 b 中的那一位。

例如,假设你有这个

a = dec 10    binary 01010  
b = dec 22    binary 10110  
a ^ b         binary 11100

您可以看到a^b中的每一位都告诉您a中的一位是否需要翻转才能生成b中的相应位(反之亦然)。事实上,这里存在对称性,每个都可以与剩下的两个中的任何一个一起使用来生成第三个。这就是异或的美妙之处(以及为什么它在加密中具有重要作用)。

© www.soinside.com 2019 - 2024. All rights reserved.