簡體   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