2013-04-08 10 views
14

Warum zeigt dieses Programm die folgende Ausgabe?Warum kann die Variable std :: bitset <8> 11111111 nicht verarbeiten?

#include <bitset> 
... 

{ 
    std::bitset<8> b1(01100100); std::cout<<b1<<std::endl; 
    std::bitset<8> b2(11111111); std::cout<<b2<<std::endl; //see, this variable 
                  //has been assigned 
                  //the value 11111111 
                  //whereas, during 
                  //execution, it takes 
                  //the value 11000111 
    std::cout << "b1 & b2: " << (b1 & b2) << '\n'; 
    std::cout << "b1 | b2: " << (b1 | b2) << '\n'; 
    std::cout << "b1^b2: " << (b1^b2) << '\n'; 
} 

Dies ist der OUTPUT:

01000000 
11000111 
b1 & b2: 01000000 
b1 | b2: 11000111 
b1^b2: 10000111 

Zuerst dachte ich, es ist etwas falsch mit der Header-Datei ist (ich war mit MinGW), damit ich geprüft MSVCC verwenden. Aber es zeigte auch das Gleiche. Bitte helfen Sie.

+2

mit 0xff wird es beheben (oder 0b11111111 ist Ihr Compiler unterstützt es) –

+0

Es könnte nett sein, wenn es binäre Initialisierung in Dezimal wie – Inverse

Antwort

48

Trotz des Aussehens ist 11111111 dezimal. Die binäre Darstellung von 11111111 ist 101010011000101011000111 . Nach der Konstruktion nimmt std::bitset<8> die acht niedrigstwertigen Bits davon: 11000111 .

Der erste Fall ist ähnlich mit Ausnahme der 01100100 ist oktal (aufgrund der führenden Null). Die gleiche Anzahl, ausgedrückt in binär, ist 1001000000001000000 .

Eine Möglichkeit zur Darstellung eines Bitsets mit einem Wert von 11111111 ist std::bitset<8> b1(0xff).

Alternativ können Sie auch eine bitset aus einem binären String konstruieren:

std::bitset<8> b1(std::string("01100100")); 
std::bitset<8> b2(std::string("11111111")); 
+0

Eine schnelle und gute Antwort! Vielen Dank! Ich habs! –

7

Per NPE Antwort, haben Sie die bitset mit einem unsigned long Konstruktion und nicht mit Bits, wie Sie erwartet hatten. Ein alternativer Weg, um es zu konstruieren, mit dem Sie die Bits angeben kann, ist von dem string Konstruktor wie folgt:

#include <bitset> 
#include <cstdio> 
#include <iostream> 

int main() 
{ 
    std::bitset<8> b1(std::string("01100100")); std::cout<<b1<<std::endl; 
    std::bitset<8> b2(std::string("11111111")); std::cout<<b2<<std::endl; 
    std::cout << "b1 & b2: " << (b1 & b2) << '\n'; 
    std::cout << "b1 | b2: " << (b1 | b2) << '\n'; 
    std::cout << "b1^b2: " << (b1^b2) << '\n'; 
getchar(); 
return 0; 
} 

Click here die Ausgabe anzuzeigen.

+0

Danke für eine gute Erklärung! –