仅使用按位运算符(|,&,〜,^,>>,<<)和其他基本运算符(如+, – 和!),是否可以替换下面的“==”?
int equal(int x, int y) { return x == y; }
如果它们之间没有差异,则两个数字相等:
int equal(int x, int y){ return !(xy); }
请记住, XOR
与NOT EQUALS
完全相同, XNOR
与EQUALS
完全相同。 因此,以下内容将为您提供您想要的内容:
return !(x ^ y);
C !
运算符实际上只是!= 0
简写,所以使用它似乎非常接近欺骗:)
这是我使用按位运算的假设,假设32位二进制补码机具有算术右移(技术上,在C算术右移是未定义的,但我在双补码机上看到的每个C编译器都支持这一点):
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
也就是说,实际的编译器没有这个问题。 真正的硬件实际上直接支持比较。 细节取决于架构,但有两个基本模型:
这个例子和减法一样,但更明确一些架构如何进行寄存器比较(比如ARM,我相信)。
return !(1 + ~x + y);
1表示进入ALU的进位位输入。 一个数字x
按位补充。 取补码并加1会产生数字的二进制补码( x
变为-x
),然后将其添加到另一个数字以获得差异以确定相等性。
因此,如果两个数字相等,则得到-x + x => 0
。
(在寄存器级别上, !
运算符未完成,您只需测试条件代码或标志寄存器的“零位”,如果寄存器操作产生的结果为零,则会置位,否则将清除。)
由于XOR与(!=)相同,因此(x ^ y)仅对相等的值返回0。 我的观点如下,因为它是明智的,使用逐位运算符和工作。
int notEqual(int x, int y){ return (x ^ y); }
我接受这个
int equal(int x, int y){ if((x & ~y) == 0) return 1; else return 0; }
说明:如果x == y
,则x & ~y
求值为0
返回1,否则返回0作为x!=y
。
Edit1: The above is equivalent to int equal(int x, int y){ return !(x & ~y) ; // returns 1 if equal , 0 otherwise. }
在最高有效位变为1的某些情况下,上述代码失败。解决方案是添加1.即正确的答案是
需要了解更多c/c++开发分享用位运算符替换“==”,也可以关注C/ C++技术分享栏目—计算机技术网(www.ctvol.com)!
return !(x & (~y +1) );
以上就是c/c++开发分享用位运算符替换“==”相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/980365.html