[英]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,因為對於任何x
, 0 & x = 0
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.