【问题标题】:How can I efficiently perform == using binary operations?如何有效地执行 == 使用二进制操作?
【发布时间】:2014-07-05 06:26:54
【问题描述】:

我有兴趣找到一个布尔/算术函数,如果两个值匹配,它将返回 -1,如果它们不匹配,则返回 0,即 == 操作。我知道这可以用逻辑非来完成,例如:

! (A-B)

如果 A == B,它将是 -1(= 111111111.... 在二进制中)。但问题是这会编译为大的右移,例如 >> 31,这是昂贵的。我希望找到可以达到相同效果的短周期二进制指令。

== 用作 R 值时如何编译,与 !(A-B) 相同?

【问题讨论】:

  • 取决于编译器和目标架构
  • 关于@PaulBeusterien 的评论,Is bit shifting O(1) or O(n)?
  • 最终你必须做一个比较才能使这个结果有用,最简单的就是异或,要么为零,要么不为零,而对于C,这就是你所需要的,零或非零.你可以做一系列的转变和 ors 把非零变成所有的,但正如在某些时候提到的,你需要做一个比较才能使这个练习有用是 0 还是 0xFFFFFFFF...
  • 我认为! (A-B) 的结果是 0 或 1,而不是 -1。
  • something xor something 将为 0 if something == something

标签: c optimization bit-manipulation equality


【解决方案1】:

这会有帮助吗?

#include <stdio.h>

int compare (int a, int b) {
char res[] = { 0, 0, -1};
char *p = &res[2];
return p[(a - b) ^ (b -a)];
}

main() {
 printf("\nans %d \n",  compare(12435, 12435));
 printf("\nans %d \n",  compare(221, 12435));
 printf("\nans %d \n",  compare(-43221, 12435));

}

顺便说一句,您可以使用 a ^ b 获得 0 表示相等

【讨论】:

    猜你喜欢
    • 2021-12-14
    • 2018-03-31
    • 1970-01-01
    • 2014-08-17
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多