有符号和无符号int、XNOR的位操作问题
Bit manipulation issues with signed and unsigned ints, XNOR
我正在实现一个并行基数排序,我正在尝试对特定位索引处的位值进行扫描,以计算基数的偏移地址。我尝试分两次扫描,一次扫描位值为"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;
问候
相关文章:
- 对字符串进行位操作
- 对字符数组中的元素执行逐位操作
- 逐位操作的隐式类型转换
- 如何进行特定的位操作?
- C++避免位操作完全移位
- 使用双包装器类进行位操作(C++、clang)修复性能下降问题
- 使用位操作优化检查
- 子集相关位操作
- 使用 c++ 提升库的按位操作
- 位操作和异或
- 位操作将最左侧的设置位转换为右侧交替位?
- 为什么对小于 4 个字节的整数类型的位操作会发生意外行为?
- POD 类型的原子按位操作
- 如何使用位操作在单个整数中编码和解码两个数字
- 查找两个二进制输入 C++ 的 xNOR 位
- __int128的位操作
- 使用位操作会影响内存消耗?
- 在具有位操作的函数中获得值
- C/C 位操作不会导致预期输出
- 有符号和无符号int、XNOR的位操作问题