2013-04-08 12 views
14

なぜこのプログラムは次の出力を表示していますか?なぜstd :: bitset <8>変数が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'; 
} 

これが出力されます:

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

まず、私は、ヘッダファイルに問題があると思った(私はMinGWのを使用していた)ので、私は はMSVCCを使用してチェック。しかしそれも同じことを示しました。助けてください。

+2

0xffを使用すると修正されます(または0b11111111がコンパイラをサポートしています) –

+0

バイナリの初期化をそのような小数点で行った場合、ちょっとしたことがあります – Inverse

答えて

48

外観にもかかわらず、11111111は10進数です。 11111111 のバイナリ表現は、101010011000101011000111 です。構築時には、std::bitset<8>はそれの8つの最下位ビットを取ります:11000111

01100100が8進数であることを除いて、最初のケースは似ています(先行ゼロのため)。バイナリで表される同じ数字は1001000000001000000 です。

11111111のビットセットを表す1つの方法は、です。std::bitset<8> b1(0xff)です。

また、あなたがバイナリ文字列からビットセットを構築することができます:NPEの答えを1として

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

すばらしい答えです!ありがとう!とった! –

7

あなたが期待していたとして、あなたはビットでunsigned longbitsetを構築し、されていません。

#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出力を表示するために:あなたはビットを指定することができ、それを構築するための別の方法は、次のようにstringコンストラクタを使用することです。

+0

良い説明をありがとう! –

関連する問題