0

为什么在 C++ 中没有像“====”这样的位比较器?我每次都必须转换变量吗?

(注意:我已经知道逻辑算术运算符,看起来不同。顺便说一下,也没有算术异或 a^^b :) 我知道我可以检查 a&b 与 a(或 b),a^b 与零,...)

#include "stdafx.h"
#include<iostream>
#include<stdlib.h>

int main()
{
    char a=-1;
    unsigned char b=0;

    for(b=0;b<255;b++)
    {
        if(a==b)std::cout<<(int)b;  //cannot find 11111111)2==11111111)2
                                    //ok, it looks -1==255 surely 
                  //if(a====b)std::cout<<" bitwise equal "; could be good
    }



    bool compare=true;
    bool bit1=false,bit2=false;
    unsigned char one=1;

    b=255; //bit-swise equal to a
    for(int i=1;i<7;i++)
    {
        bit1=(a>>i)&one;
        bit2=(b>>i)&one;
        if(bit1!=bit2){compare=false;return;}//checks if any bit is different 
    }

    if(compare)std::cout<<(int)b; //this writes 255 on screen

    getchar();
    return 0;
}

谢谢。

我本可以这样做:

__asm
     {
          push push....
          mov al,[a]
          mov dl,[b]
          cmp al,dl    //this is single instr but needs others
          je yes       
          mov [compare],false
          jmp finish
          yes:
          mov [compare],true
          jmp finish

          finish:
          pop pop...

臃肿的代码...

4

4 回答 4

2

这样的运营商不会工作,因为它会依赖于平台。

我假设当 x 和 y 具有不同的长度时,'x === y' 应该返回 false,并且由于 int 在不同平台上具有不同的长度,因此该操作的结果也是如此。

于 2012-09-05T07:16:49.720 回答
2

你真的需要比较有符号和无符号吗?

您应该重新设计您的算法以使 的两个操作数==具有相同的符号。

于 2012-09-05T07:17:11.560 回答
2

您不能对char或进行任何比较unsigned char。积分提升意味着您可以比较的最小积分类型是 int; thechar和 theunsigned char都将int 在比较之前提升。(之后,在大多数现代机器上,按位比较和值比较之间没有区别。)

我很想说你不应该想要逐位比较。在许多方面,隐式转换(包括提升)比其他任何事情都会导致更多问题,从逻辑上讲,您应该明确并指定要比较的内容。(如果类型是 ,则保证相等性的测试是“大的” unsigned char。这就是为什么memcmp根据比较来定义的原因unsigned char 。)

于 2012-09-05T08:15:45.987 回答
1

您可以执行以下操作:

a ^ b == 0
于 2012-09-05T07:12:09.940 回答