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



我正在学习位算法,并看到了找到两个值最大值的方程:

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

解释说这个方程将在不使用比较的情况下找到最大值,并且"如果 x <y,那么><y(>

这是一个非常棘手的代码。事实是 C 没有任何布尔类型:它使用整数代替:0 表示 false1 表示 true

因此-(x<y)意味着

  • 0如果x≥y
  • -1如果x<y

然后将其用作位掩码。

编辑

正如Jonathan Leffler在评论中建议的那样,C现在有一个_Bool。我做了这个小程序来检查它是什么以及如何使用它:

#include <stdio.h>
int main() {  
  _Bool bFalse = 1>2;    
  printf("size of _Bool: %lunsize of comparison result: %lun", sizeof(bFalse), sizeof(1>2));
  return 0;
}

这输出:

size of _Bool: 1
size of comparison result: 4

换句话说,_Bool是一个字节(一个char(,但它没有作为布尔比较的结果使用(我的编译器生成 4 个字节,即一个int(

注:在英特尔处理器上使用 Clang 进行测试。

编辑:按照评论中的建议修复类型(并在检查 clang IR 后(

"如果 x

,则 -(x <y(>

这是因为,如果 x 小于 y,则条件计算结果为 true(等于 1(。请注意比较前的否定符号,它将比较结果的"1"设为"-1"。在二进制世界中,-1 具有全 1 表示,请参阅 Two's_complement。示例:1111 1111 = -1。

但是,如果 x> y,你会得到一个 -0,它在二进制中再次全部为零。

在这里,"<"只是一个"x is_less_than y"比较检查,一个逻辑运算符。

最新更新