小于运算符在C中还有什么意义?

时间:2017-03-16 04:47:15

标签: c bit-manipulation

我正在学习位算法并且看到了找到两个值的最大值的等式:

r = x ^ ((x ^ y) & -(x < y)); // max(x, y)

解释说这个等式将在不使用比较的情况下找到最大值,并且&#34;如果x&lt; y,那么 - (x

2 个答案:

答案 0 :(得分:2)

这是一个非常棘手的代码。事实是C没有任何布尔类型:它使用整数:0 false1 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)

“如果x y,你得到一个-0,它在二进制中再次为零。 在这里,'&lt;'只是一个“x is_less_than y”比较检查,一个逻辑运算符。