我正在学习位算法并且看到了找到两个值的最大值的等式:
r = x ^ ((x ^ y) & -(x < y)); // max(x, y)
解释说这个等式将在不使用比较的情况下找到最大值,并且&#34;如果x&lt; y,那么 - (x
答案 0 :(得分:2)
这是一个非常棘手的代码。事实是C没有任何布尔类型:它使用整数:0
false
和1
true
。
因此-(x<y)
表示
0
if x≥y
-1
if x<y
然后将其用作位掩码。
修改强>
正如Jonathan Leffler在评论中所建议的,C现在有一个_Bool。 我制作了这个小程序来检查它是什么以及如何使用它:
#include <stdio.h>
int main() {
_Bool bFalse = 1>2;
printf("size of _Bool: %lu\nsize of comparison result: %lu\n", sizeof(bFalse), sizeof(1>2));
return 0;
}
输出:
size of _Bool: 1
size of comparison result: 4
换句话说,_Bool
是一个字节(一个char
),但它不会被用作布尔比较的结果(我的编译器生成4个字节,即int
)
注意:在英特尔处理器上使用Clang进行测试。
编辑修复评论中善意建议的类型(以及检查clang IR后)
答案 1 :(得分:2)