2013-12-08 26 views

回答

20

那些常量不是二进制的,这就是为什么。 1100十进制是10001001100二进制。 0110 八进制1001000二进制。 (为什么八进制的第二个?因为一个常数,以一个前导零开始,只包含数字0..7在C++中是八进制的。)

当您将两个截断为4位时,得到1100二进制异或1000二进制,它给出了0100二进制。

试试这个(假设你的编译器支持非标准前缀0b为二进制文字):

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

或字符串常量::(C

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

或者,在十六进制指定常数++ 11)

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

二进制文字('0b ...')不是标准C++的一部分(虽然在C++ 14中)。一些编译器将它们作为扩展来实现。 – interjay

+0

@Joe Z非常感谢:D你救了我:D – BlackProg

+0

@interjay:够公平的......我会在上面提及。 –

2

问题是升als 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; 
+0

八进制0110是十进制的72。但你有正确的想法。 –

+0

我的错误。我没有乘8乘8,而是乘2乘8乘8 :) –