【发布时间】:2021-04-22 19:06:37
【问题描述】:
有没有办法简化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两次?
【问题讨论】:
-
编译器擅长常量折叠,所有的编译时常量表达式都可以由编译器自己计算,只有结果会出现在生成的代码中。编译器还可以生成重用先前计算结果的代码,特别是如果它可以推断它不会在两者之间发生变化(常量永远不会)。因此,请在启用优化的情况下进行构建,并查看生成的代码。我相信它会尽可能地达到最佳状态。
-
@Someprogrammerdude:sensor_mask 是一个变量,所以您所说的某些内容并不完全正确!我能想到的只有'ALL_SENSORS & (~sensor_mask)'
-
作为优化的一般规则:你几乎不值得做这样的低级微优化。编译器几乎总是会做得更好。更不用说手写的优化往往晦涩难懂,难以阅读、理解和维护。如果您遇到性能问题,请分析优化的构建,并专注于最重要的两个(或者可能是三个)瓶颈。
-
ALL_SENSORS是常量吗?例如,BIT(x)只是(1 << (x)),而不是像函数调用或包含sensor_mask的宏这样的奇怪东西? -
使用
int进行按位运算几乎肯定是错误的,因此您可能想用uint32_t等替换它。
标签: c binary-operators