C ++中char和unsigned char的按位比较

时间:2012-09-05 07:10:00

标签: c++ comparison bit-manipulation

为什么在C ++中没有像“====”那样的比特式比较器?我每次都要编译变量吗?

(注意:我已经知道逻辑算术运算符,看起来不一样。顺便说一下,没有算术-xor a ^^ b也:) 我知道我可以检查一个& 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 个答案:

答案 0 :(得分:2)

您可以执行以下操作:

a ^ b == 0

答案 1 :(得分:2)

这样的运算符不起作用,因为它取决于平台。

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

答案 2 :(得分:2)

你真的需要将签名与未签名比较吗?

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

答案 3 :(得分:2)

您无法在charunsigned char上进行任何比较。积分 促销意味着您可以比较的最小整数类型 int; charunsigned char都将提升为int 在比较之前。 (之后,在大多数现代机器上,那里 在按位比较和值比较之间没有区别。)

我很想说你不应该想要逐位比较。在很多 方式,隐含的转换(包括促销)会导致更多 问题比什么都重要,从逻辑上讲,你应该 显式,并指定要比较的内容。 (和测试 如果类型为unsigned char,则保证平等“大”。 这就是为memcmp定义unsigned char的原因 比较。)