2014-10-10 213 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