2013-04-08 11 views
14

Perché questo programma mostra il seguente output?Perché la variabile std :: bitset <8> non è in grado di gestire 11111111?

#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'; 
} 

Questa è l'uscita:

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

In primo luogo, ho pensato che c'è qualcosa di sbagliato con il file di intestazione (stavo usando MinGW), così ho controllato utilizzando MSVCC. Ma anche ha mostrato la stessa cosa. Per favore aiuto.

+2

utilizzando 0xff lo risolverà (o 0b11111111 è il compilatore che lo supporta) –

+0

Potrebbe essere un po 'pulito se ha fatto l'inizializzazione binaria in decimale come quella – Inverse

risposta

48

Nonostante l'aspetto, il numero 11111111 è decimale. La rappresentazione binaria di 11111111 è 101010011000101011000111 . Al momento della costruzione, std::bitset<8> prende gli otto bit meno significativi di questo: 11000111 .

Il primo caso è simile ad eccezione del 01100100 è ottale (a causa dello zero iniziale). Lo stesso numero espresso in binario è 1001000000001000000 .

Un modo per rappresentare un set di bit con un valore di 11111111 è std::bitset<8> b1(0xff).

In alternativa, è possibile costruire un bitset da una stringa binaria:

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

A rapida e grande risposta! Grazie! Fatto! –

7

Come per la risposta di NPE, si sta costruendo la bitset con unsigned long, e non con i bit come ti aspettavi. Un modo alternativo per costruirlo, che consente di specificare i bit, è utilizzando il costruttore string come segue:

#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 per visualizzare l'output.

+0

Grazie per una buona spiegazione! –

Problemi correlati