带符号和无符号整数的位操作问题,XNOR
我正在实现一个并行基数排序,我试图扫描特定位索引处的位值以计算基数的偏移地址。我试图在两次扫描中进行扫描,其中位值为'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
试试这个:
int useVal1 = (~(bitVal1^(doOnes?1:0)))&1; // XNOR = ~(val1^val2)
int useVal0 = (~(bitVal0^(doOnes?1:0)))&1;
问候
这仍产生与上面相同的输出。 – KDecker 2014-10-10 20:14:43
我更新了答案。问题在于该操作是在int的所有32位上完成的。 – 2014-10-10 20:19:03
对不起..我已经改变了变量名的问题,使其更容易解释。上面做了一个编辑,现在是正确的。 – KDecker 2014-10-10 20:05:51
对于'BitVal1X'我期望'0'或false,'BitVal0X'我期望'1'或true。 – KDecker 2014-10-10 20:07:06