c - C 中小于运算符还有什么含义?

标签 c bit-manipulation

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

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

解释说这个方程将在不使用比较的情况下找到最大值,并且“如果 x < y,则 -(x < y) 将全部为 1”。我无法理解解释的含义,因为我在等式中看到一个“小于”运算符,如果这是一个小于运算符,则 (x < y) 应仅返回一位数据。因此,为了使解释有意义,符号“<”不能是小于运算符。我查看了 C 运算符列表,没有找到运算符“<”的其他含义。有人能告诉我运算符“<”在这个方程中起什么作用吗?谢谢!

最佳答案

这是一段非常棘手的代码。事实上,C 没有任何 bool 类型:它使用整数代替: 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: %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 ),但它不用作 bool 比较的结果(我的编译器生成 4 个字节,即 int )

注意:在 Intel 处理器上使用 Clang 进行测试。

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

关于c - C 中小于运算符还有什么含义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42825509/

相关文章:

c++ - 为什么使用私有(private)动态数组时性能最差

c++位操作如何打印出16、32位

c++ - 为空间优化 tribools 数组

c - char 变量的编码类型是什么?

c - poll 和 epoll 事件标志兼容吗?

C代码编译失败

c - Sandy Bridge 上的 32 字节存储转发

c - 在 C 中屏蔽后打包位

python - 按位运算在 Python 中如何工作?

c - 将表示有符号整数的字节数组转换为整数的公式