C++ 如何用按位操作替换此if/else语句?

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

我在两个位数组之间按位执行&将结果保存在旧的_数组中,我想去掉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_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]);