【问题标题】:Parity of integer with arbitrary bits in pythonpython中具有任意位的整数奇偶校验
【发布时间】:2021-01-02 08:44:32
【问题描述】:

许多解决方案建议使用带有右移功能的异或,如此处所述 https://www.geeksforgeeks.org/finding-the-parity-of-a-number-efficiently/

def findParity(x):
    x = x ^ (x >> 16); 
    x = x ^ (x >> 8); 
    x = x ^ (x >> 4);
    x = x ^ (x >> 2); 
    x = x ^ (x >> 1); 
    return x & 1; 

但他们假设 32 或 64 位或一些 2^n 位整数。在 python 中,整数可以有任意数量的位。例如 i = 7,只有 3 位。

i = 7
print(len(bin(i)) - 2)

关于如何使用异或和右移任意位数计算奇偶校验有什么建议吗?

【问题讨论】:

  • 您没有尝试循环测试位 0 并在每次迭代中右移一位直到值为 0 吗?很容易扩展到一次执行 8 位,在查找表中查找最低 8 位,为该值提供奇偶校验。
  • 是的,该解决方案有效,但它不是 nlog(n) 时间解决方案。它需要 O(n) 个步骤。查找表是比较复杂的解决方案。
  • 什么?您的问题中没有写任何其他要求?请以minimal reproducible example 的形式分享您编写的最佳代码。

标签: python bit parity


【解决方案1】:

您可以使用循环来动态更改奇偶校验的长度:

def parity(num):
    length = math.ceil(math.log2(math.ceil(math.log2(num)+1)))
    for i in range(length-1, -1, -1):
        print(2**i)
        num^=(num >> (2**i))
    return num&1

您将需要使用log 两次,因为您首先必须找到数字的长度,然后您需要log 那么多操作。

【讨论】:

  • 完美,我在同一个方向探索。我忽略了 log2 应该是位的长度,而不是整数的值。
猜你喜欢
  • 2015-04-04
  • 2015-06-29
  • 1970-01-01
  • 1970-01-01
  • 2014-03-06
  • 2014-03-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多