首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用位运算符替换"==“

用位运算符替换"==“
EN

Stack Overflow用户
提问于 2010-11-12 12:38:17
回答 6查看 37.9K关注 0票数 25

仅使用按位运算符(|、&、~、^、>>、<<)和其他基本运算符(如+、-和!),是否可以替换下面的"==“?

代码语言:javascript
运行
复制
int equal(int x, int y) {
    return x == y;
}
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-11-12 12:42:07

如果两个数字之间没有差异,则它们是相等的:

代码语言:javascript
运行
复制
int equal(int x, int y){
   return !(x-y);
}
票数 26
EN

Stack Overflow用户

发布于 2010-11-12 12:40:44

请记住,XORNOT EQUALS完全相同,XNOREQUALS完全相同。因此,下面的代码将完全满足您的需求:

代码语言:javascript
运行
复制
return !(x ^ y);
票数 77
EN

Stack Overflow用户

发布于 2010-11-12 16:01:32

C !操作符实际上只是!= 0的简写,所以使用它似乎非常接近欺骗:)

下面是我仅使用位操作的观点,假设32位二进制补码机器具有算术右移位(从技术上讲,在C中,右移算术是未定义的,但我在二进制补码机器上见过的每个C编译器都正确地支持这一点):

代码语言:javascript
运行
复制
int t = (x - y) | (y - x); // <0 iff x != y, 0 otherwise
t >>= 31; // -1 iff x != y, 0 otherwise
return 1 + t; // 0 iff x != y, 1 otherwise

也就是说,实际的编译器没有这个问题。真正的硬件实际上直接支持比较。具体细节取决于架构,但有两个基本模型:

算术运算返回的

  1. 条件码(例如,x86和ARM执行此操作)。在这种情况下,通常有一个“比较”指令,它减去两个值,不写回整数寄存器,但根据结果设置条件代码/标志。
  2. 更类似于RISC的平台通常有直接的“等于分支”和“小于分支”操作数,它们根据结果进行比较和分支。它基本上等同于C代码

如果(a == b)转到标签;

如果(a < b)转到标签;

all in one机器指令。

票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4161656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档