繁体   English   中英

元组/列表中所有整数的按位与

[英]Bitwise AND for all integers in tuple/list

我有以下 function,其中 v 是一个整数元组,hits 是一个 integer。function 使用位掩码首先检查元组中的任何两个整数是否共享设置位,然后检查 hits 中的所有设置位是否也是设置在元组中的整数之间

def noCollisionsBin(v, hits): 
    for x, y in itertools.combinations(v,2):    
        if (x & y): #if any 2 integers share set bits, they are overlapping
            return False
    tot = 0
    for i in v:
        tot |= i

    return (tot & hits) == hits #if all set bits of "hits" are set in the integers combined, the configuration is valid.

它有效,但我觉得应该有一种比使用itertools.combinations()更有效的方法来检查第一个条件。 我不想循环遍历数组两次,而是只想循环一次,以类似于我使用 |= 来组合 v 中整数的设置位的方式,以累积方式使用按位 AND。我尝试了以下解决方案,但它产生了太多的有效组合,表明第一个条件没有正确检查。

def noCollisionsBin(v, hits):
    tot_and = v[0]
    tot = v[0]
    for i in range(1,len(v)):
        tot |= v[i]
        tot_and &= v[i]
        if tot_and:
            return False
    
    return (tot & hits) == hits

我希望我正在尝试做的事情有意义。 我对使用位运算符还很陌生,非常感谢任何帮助!

您没有提供任何代码来检查 output 是否正确,但我相信以下内容会起作用。 关键思想是tot存储所有在先前数字中设置的位。 如果有任何冲突,则tot & v[i]将设置重复位,因此将大于 0。

def noCollisionsBin(v, hits):
    tot = 0
    for i in range(len(v)):
        if tot & v[i] > 0:
            return False
        tot |= v[i]
    return (tot & hits) == hits

关于为什么你的第二个代码示例没有按预期工作的注释:它只检查v的前两个元素中的冲突。 如果它们发生碰撞,则循环将在第一次迭代中正确返回False 但是,如果他们不这样做,则tot_and将等于 0,并且对于循环的其余部分将为 0,因为对于任何x0 & x = 0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM