C++ 如何用按位操作替换此if/else语句?
我在两个位数组之间按位执行&将结果保存在旧的_数组中,我想去掉if/else语句。我可能应该使用BIT_STATE宏,但是如何使用呢C++ 如何用按位操作替换此if/else语句?,c++,bit-manipulation,C++,Bit Manipulation,我在两个位数组之间按位执行&将结果保存在旧的_数组中,我想去掉if/else语句。我可能应该使用BIT_STATE宏,但是如何使用呢 #define BYTE_POS(pos) (pos / CHAR_BIT) #define BIT_POS(pos) (1 << (CHAR_BIT - 1 - (pos % CHAR_BIT))) #define BIT_STATE(pos, state) (state << (CHAR_BIT - 1 - (pos % CHAR_BI
#define BYTE_POS(pos) (pos / CHAR_BIT)
#define BIT_POS(pos) (1 << (CHAR_BIT - 1 - (pos % CHAR_BIT)))
#define BIT_STATE(pos, state) (state << (CHAR_BIT - 1 - (pos % CHAR_BIT)))
if (((old_array[BYTE_POS(old_pos)] & BIT_POS(old_pos)) != 0) &&
((new_array[BYTE_POS(new_pos)] & BIT_POS(new_pos)) != 0))
{
old_array[BYTE_POS(old_pos)] |= BIT_POS(old_pos);
}
else
{
old_array[BYTE_POS(old_pos)] &= ~(BIT_POS(old_pos));
}
#定义字节位置(位置)(位置/字符位)
#定义位(POS)(1是的,这样的代码看起来有点难看。
我不认为BIT_状态在这里有用。(状态必须为0或1才能按预期工作)
我看到了以下方法来摆脱它们
a)使用C++ Bields
比如说
(b)
“隐藏”类/方法/函数中的代码
(c)
我认为这相当于你的代码
if ((new_array[BYTE_POS(new_pos)] & BIT_POS(new_pos)) == 0))
{
old_array[BYTE_POS(old_pos)] &= ~(BIT_POS(old_pos));
}
或作为内联线
old_array[BYTE_POS(old_pos)] &=
~((new_array[BYTE_POS(new_pos)] & BIT_POS(new_pos)) ? 0 : BIT_POS(old_pos));
您始终可以计算这两个结果,然后将其合并。最大的问题是计算合适的位掩码
例如
或者避免一元不
const uint32_t mask_a[2] = { 0, 0xffffffff },
mask_b[2] = { mask_a[1], mask_a[0] };
const uint32_t result = (a&mask_a[condition])
| (b&mask_b[condition]);
但是:在执行逐位操作时,始终要注意所涉及的位数。一种小心的方法是像uint32_t这样的固定大小的类型,它们可能在您的平台上定义,也可能不在您的平台上定义(但如果不定义,那么好的是您会遇到编译错误),或者小心地使用模板。其他类型,包括char
、int
甚至bool
可以具有超出某个定义最小值的任何大小。采用表达式
(新数组[字节位置(新位置)]&位位置(新位置))
如果设置在位位置(旧位置)中,则在位位置(新位置)中为0或有1,并将其移动到该位
(新数组[字节位置(新位置)]&位位置(新位置))>(新位置-旧位置)(如果适用)
我还没试过。我可能已>交换。如果您能将代码简化为相关位,那将非常有帮助。例如,您是否有old\u数组[字节位置(old\u位置)]
?您不能只使用x
?可能重复Yes,这是if/else语句的简化。现在我只需要摆脱它。建议a-c)注意到。我不认为你能摆脱没有位域的“如果”oe:“
const uint32_t mask_a[2] = { 0, 0xffffffff },
mask_b[2] = { mask_a[1], mask_a[0] };
const uint32_t result = (a&mask_a[condition])
| (b&mask_b[condition]);