2016-08-15 275 views
-1

給定閾值T和一組位圖的狀況,我想創建一個結果位圖「BR」,使得「BR」第i個比特被設置爲1僅在I」 > = T位圖中th位設置爲1。邏輯與運算符與

我會嘗試用一個例子,我的問題: 讓我們假設我們有4位圖(相等長度的)和T = 3:

b1 (10000) 
b2 (01110) 
b3 (10110) 
b4 (00010) 

然後我得到的位圖BR =(00010 ) - 因爲在> = 3位圖中只有第4位被設置爲1。如果T = 2,則br =(10110)。

一種簡單的方式來做到這一點是通過每個位迭代,並保持存儲位的計數向量「我」在第i個指標。之後,可以迭代這個「計數」向量。

的另一種方式(我認爲)是實施的變形邏輯AND運算符,使得在結果位圖中,如果在> = T的位置設置爲1的第i個比特被設置爲1。

是否有任何其他有效的方式來做到這一點?我正在使用C++和EWAHBoolArray(https://github.com/lemire/EWAHBoolArray)庫。目前,他們沒有能力在多個位圖之間進行AND操作。 任何迴應非常感謝!

+1

你可以有幾個位圖d,使得Dj的位圖B(即總和的第j位,DJ的第i位是二進制數的第j位,其是位圖的數目(集合B)在位置i)處具有1。在你的例子中,他們將是{(01010)(10110)(00000)}。 – Beta

+0

一個可怕的問題,請閱讀[MCVE]。 –

回答

0

你可以做一些旋轉和添加。你真的想得到個人位的總和。爲了在正常添加的情況下執行此操作,您需要爲每列可以獲得的最大總和騰出空間。你可以通過將每個值分成3部分進行屏蔽。然後,您添加一個常數,確保您所需的總和設置高位,然後您可以將其屏蔽掉。

b1a = b1 & 0b01001; 
b1b = (b1 >> 1) & 0b01001; 
b1c = (b1 >> 2) & 0b01001; 
b2a = b2 & 0b01001; 
... 
bra = ((b1a + b2a + b3a + b4a + 0b01001) & 0b100100) >> 2; 
brb = ((b1b + b2b + b3b + b4b + 0b01001) & 0b100100) >> 1; 
brc = ((b1c + b2c + b3c + b4c + 0b01001) & 0b100100); 
br = bra | brb | brc;