我正在實現一個並行基數排序,我試圖掃描特定位索引處的位值以計算基數的偏移地址。我試圖在兩次掃描中進行掃描,其中位值爲'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
對不起..我已經改變了變量名的問題,使其更容易解釋。上面做了一個編輯,現在是正確的。 – KDecker 2014-10-10 20:05:51
對於'BitVal1X'我期望'0'或false,'BitVal0X'我期望'1'或true。 – KDecker 2014-10-10 20:07:06