简化 C 中的二进制 and 和 xor

Simplify binary and and xor in C

有没有办法简化 C 中的以下表达式?

result = (constant & value) ^ value;

用例是:

#define ALL_SENSORS = (BIT(0) + BIT(1) + BIT(2) + BIT(19))  # = 524295

static int get_invalid_sensors(int sensor_mask) {
    return (ALL_SENSORS & sensor_mask) ^ sensor_mask;
}

是否可以将二元运算简化为一个,这样我就不需要调用 sensor_mask 两次?

(~ALL_SENSORS & sensor_mask)怎么样?

好吧,如果您将此(或至少类似的)代码放入 here。然后你可以看到针对 RISC-V 的优化代码是

get_invalid_sensors: # @get_invalid_sensors
  not a0, a0
  and a0, a0, a1
  ret

由此可见(~ALL_SENSORS & sensor_mask)已经说的够用了。但是您也可以意识到编译器很可能无论如何都能优化您的代码。

表达式 (ALL_SENSORS & sensor_mask) ^ sensor_mask 的目标是屏蔽 sensor_mask 中不在 ALL_SENSORS 中的所有位。您也可以通过 ~ALL_SENSORS & sensor_mask 完成此操作。