提问人:Sedmaister 提问时间:8/20/2019 最后编辑:Nipun TharukshaSedmaister 更新时间:8/21/2019 访问量:252
如何在 C 语言中简化逻辑运算
How to simplify logical operation in C
问:
我有以下逻辑,需要简化才能看起来更清晰和简洁:
if (x1 < y1)
return 1;
else if (x1 == y1)) {
if (x2 < y2)
return 1;
else if (x2 == y2) {
if (x3 < y3)
return 1;
} else
return 0;
}
} else
return 0;
为了解决上述问题,我应用了逻辑表达式来进一步简化这几行条件:
if (x1 < y1 || (x1 == y1 && x2 < y2) || (x1 == y1 && x2 == y2 && x3 < y3))
return 1;
else
return 0;
我不确定如何从这里进一步简化。谁能帮我?
更新:为了进一步简化,我尝试将布尔代数应用于此表达式,但没有运气!我想出了这个:
A + (A1 * B) + (A1 * B1 * C)
其中表示 to 和 表示A
x1 < y1
A1
x1 == y2
答:
0赞
Chris Dodd
8/20/2019
#1
IMO 在 C 语言中执行这种链式关系的最简洁方法是:?:
return x1 == y1 ? x2 == y2 ? x3 < y3 : x2 < y2 : x1 < y1;
正如问题注释中所指出的,如果您真的关心性能,并且值的范围有限,则可以使用位旋转将它们组合成一个值进行比较。例如,如果字段都是uint16_t(无符号 16 位值),则可以执行以下操作:
uint64_t x = ((uint64_t)x1 << 32) + ((uint64_t)x2 << 16) + x3;
uint64_t y = ((uint64_t)y1 << 32) + ((uint64_t)y2 << 16) + y3;
return x < y;
但这可能不太清楚,可能为时过早的优化。
评论
0赞
8/20/2019
我相信这更具可读性:因为 和 很接近,x2、y2 也是如此。它还会立即处理短分支。return x1 != y1 ? x1 < y1 : (x2 != y2 ? x2 < y2 : x3 < y3);
x1 != y1
x1 < y1
0赞
Chris Dodd
8/21/2019
@dyukha:合理,但您可能应该删除多余的括号,使其不太清楚。
评论
x1 < y1 || (x1 == y1 && (x2 < y2 || (x2 == y2 && x3 < y3)))