问题描述
有没有办法简化PS1
中的以下表达式?
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;
}
两次了?
解决方法
(~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
执行此操作。