我正在实现并行基数排序,我试图对特定位索引处的位值进行扫描,以计算基数的偏移地址。我试图在两次传递中进行扫描,对于' 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
答案 0 :(得分:2)
答案 1 :(得分:0)
试试这个:
int useVal1 = (~(bitVal1 ^ (doOnes?1:0)))&1; // XNOR = ~(val1 ^ val2)
int useVal0 = (~(bitVal0 ^ (doOnes?1:0)))&1;
此致