c/c++语言开发共享用位运算符替换“==”

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

int equal(int x, int y) { return x == y; } 

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

     int equal(int x, int y){ return !(xy); } 

    请记住, XORNOT EQUALS完全相同, XNOREQUALS完全相同。 因此,以下内容将为您提供您想要的内容:

     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

      (0)
      上一篇 2021年12月13日
      下一篇 2021年12月13日

      精彩推荐