这个xor有什么错误

时间:2013-12-08 19:56:31

标签: c++ xor

为什么,在C ++中使用这个xor时,

int main() {
    bitset<4> a=1100, b=0110,c;
    c = a ^ b;
    cout << c;
    return 0;
}

结果是0100?

2 个答案:

答案 0 :(得分:20)

这些常量不是二进制的,这就是原因。 1100十进制是10001001100二进制。 0110 octal 1001000二进制。 (为什么八进制用于第二个?因为以前导零开头并且仅由数字0..7组成的常量在C ++中是八进制的。)

当你将两者都截断为4位时,你得到1100二进制XOR与1000二进制,这给出了0100二进制。

请尝试这样做(假设您的编译器支持二进制文字的非标准前缀0b):

int main() {
    bitset<4> a=0b1100, b=0b0110,c;
    c = a ^ b;
    cout << c;
    return 0;
}

或者,以十六进制指定常量:

int main() {
    bitset<4> a=0xC, b=0x6,c;
    c = a ^ b;
    cout << c;
    return 0;
}

或作为字符串常量:(C ++ 11)

int main() {
    bitset<4> a( "1100" ), b( "0110" ),c;
    c = a ^ b;
    cout << c;
    return 0;
}

答案 1 :(得分:2)

问题是文字1100和0110不是二进制文字。第一个是十进制文字1100,第二个是八进制文字0110,十进制等于24.您应该使用字符串文字来获得所需的结果。例如,考虑以下代码snipet的结果

    std::bitset<4> a = 1100, b = 0110, c;
    c = a ^ b;
    std::cout << "a = " << a << std::endl;
    std::cout << "b = " << b << std::endl;
    std::cout << "c = " << c << std::endl;

    std::bitset<4> a1( "1100" ), b1( "0110" ), c1;
    c1 = a1 ^ b1;
    std::cout << "a1 = " << a1 << std::endl;
    std::cout << "b1 = " << b1 << std::endl;
    std::cout << "c1 = " << c1 << std::endl;