有符号和无符号整数的位操作问题,XNOR

时间:2014-10-10 19:54:20

标签: c++ cuda

我正在实现并行基数排序,我试图对特定位索引处的位值进行扫描,以计算基数的偏移地址。我试图在两次传递中进行扫描,对于' 0'的位值。和一个用于' 1'的比特值。

我正在尝试创建一个标志,表明我是否要使用特定的位值。我将一个布尔标志传递给我的内核,该标志指出我是否想使用“0”和“0”的位。或者' 1',该标志称为doOnes。如果该标志为真,并且位值为1,那么我想将另一个标志useBit设置为true,因此我知道在我的内核中将其考虑在内。如果该标志为真,并且位值为0,那么我希望useBit标志为false。

我可以确认我得到了正确的比特值。我的问题是在下面计算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

2 个答案:

答案 0 :(得分:2)

一元运算符~反转所有位,您希望一元运算符!反转布尔值。

!(bitVal1 ^ doOnes)

Live example

答案 1 :(得分:0)

试试这个:

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

此致