简化 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
完成此操作。
有没有办法简化 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
完成此操作。