2014-10-10 215 views
-1

我正在實現一個並行基數排序,我試圖掃描特定位索引處的位值以計算基數的偏移地址。我試圖在兩次掃描中進行掃描,其中位值爲'0',一位值爲'1'。帶符號和無符號整數的位操作問題,XNOR

我想創建一個標誌,是否要使用特定的位值或不使用。我將一個布爾標誌傳遞給我的內核,表明我是否想使用'0'或'1'位,該標誌被稱爲doOnes。如果標誌爲真,並且位值爲1,那麼我想將另一個標誌useBit設置爲true,所以我知道在我的內核中考慮它。如果該標誌爲真,並且該位值爲0,那麼我希望useBit標誌爲假。

我可以確認我正在獲得正確的位值。我的問題是計算useVal下面。

// This simulates the flag passed to the kernel 
bool doOnes = false; 

// This simulates the unsigned int bit value that I get within my kernel 
unsigned int bitVal1 = 1; 
unsigned int bitVal0 = 0; 
printf("> BitVal1: %u BitVal0: %u \n", bitVal1, bitVal0); 

// Here is how I determine if I want to use the data at the bits index or not 
int useVal1 = ~(bitVal1^doOnes); // XNOR = ~(val1^val2) 
int useVal0 = ~(bitVal0^doOnes); 
printf("> BitVal1X: %i BitVal0X: %i \n", useVal1 , useVal0); 

這裏是輸出端產生

> BitVal1: 1 BitVal0: 0 
> BitVal1X: -2 BitVal0X: -1 

我怎樣才能正確地結合起來的標誌doOnes和位值來確定,如果我想使用它?

編輯:

這裏是我想要的

doOnes | bitVal | useBit = XNOR(doOnes, bitVal) 
------------------------------ 
true | 0 | false 
true | 1 | true 
false | 0 | true 
false | 1 | false 
+0

對不起..我已經改變了變量名的問題,使其更容易解釋。上面做了一個編輯,現在是正確的。 – KDecker 2014-10-10 20:05:51

+0

對於'BitVal1X'我期望'0'或false,'BitVal0X'我期望'1'或true。 – KDecker 2014-10-10 20:07:06

回答

2

元運算符~反轉所有位,你要單目運算符!這反轉了布爾值。

!(bitVal1^doOnes) 

Live example

0

試試這個:

int useVal1 = (~(bitVal1^(doOnes?1:0)))&1; // XNOR = ~(val1^val2) 
int useVal0 = (~(bitVal0^(doOnes?1:0)))&1; 

問候

+0

這仍產生與上面相同的輸出。 – KDecker 2014-10-10 20:14:43

+0

我更新了答案。問題在於該操作是在int的所有32位上完成的。 – 2014-10-10 20:19:03