有符号和无符号int、XNOR的位操作问题

Bit manipulation issues with signed and unsigned ints, XNOR

本文关键字:XNOR 位操作 问题 int 符号 无符号      更新时间:2023-10-16

我正在实现一个并行基数排序,我正在尝试对特定位索引处的位值进行扫描,以计算基数的偏移地址。我尝试分两次扫描,一次扫描位值为"0",另一次扫描值为"1"。

我正在尝试创建一个标志,指示我是否要使用特定的位值。我将一个布尔标志传递到我的内核中,该标志表示我是想使用"0"还是"1"的位,该标志被称为doOnes。如果标志为true,并且位值为1,那么我想将另一个标志useBit设置为true,这样我就知道在我的内核中要考虑它。如果标志为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

一元运算符~反转所有位,您需要反转布尔值的一元运算符!

!(bitVal1 ^ doOnes)

实例

试试这个:

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

问候