2016-05-02 12 views
1

std::bitsetを使用して10進値を2進表現に変換していますが、bitsetが符号付きの値を処理するかどうかはわかりません。ビットセットと符号付きの値

たとえば、bitset<10>(5)0000000101です。しかし、どうすればbitset<10>(-5)?ここで

は、特定の私のコードです:

while (getline(ss, token, ',')){ 
    ss.ignore(); 
    myString.push_back(token); 
} 
myString[0].erase(0, 1); 
myString[1].erase(0, 1); 
rt = bitset<7>(stoi(myString[0])).to_string(); 
ra = bitset<7>(stoi(myString[1])).to_string(); 
i10 = bitset<10>(stoi(myString[2])).to_string(); 

i10が署名しなければなりません。私の現在のコードは署名された値を扱いますか? myStringはユーザーが入力した10進表現を保持しますが、ファイルへの連結や書き込みを行う必要がありますので、簡単に文字列に変換します。

答えて

2

bitsetは署名ネス自体を処理しません。あなたが呼び出しているコンストラクタはunsignedの整数をとります。 [bitset.cons]から:

constexpr bitset(unsigned long long val) noexcept; 

影響:ヴァルに対応 ビット値に第Mビット位置を初期化する、クラスbitset<N>のオブジェクトを構築します。 MNの小さい方であり、値表現(3.9)のビット数は の符号なしlong longです。 M < Nの場合、残りのビット位置はゼロに初期化されます。

ですから、0xfffffffffffffffbとしてunsigned long longに変換されます-5、とそれを呼び出す場合。下の10ビットは0x3fbです。これはあなたが得るセットです。しかし、それは無署名です。 - bitsetは、ビットの集合であると言うことである

unsigned long to_ulong() const; 
unsigned long long to_ullong() const; 

全ては:両方の変換関数は、([bitset.members]からの)符号なしの値をあなたに戻って与えます。それは記号がありません。最初のビットは特別ではありません - それは別のビットです。

+0

私は奇妙です - それは常に適切な2の補数の2進表現を返す – tobspr

+0

@Barry署名付きのハンドルを持つコンストラクタはありますか? – Javia1492

+0

@ Javia1492なぜでしょうか? – Barry

1

Bitsetはバイナリ表現を返します。負の数は2の補数を使用して格納されるため、2つの補数の表現が得られます。たとえば:

cout << bitset<12>(-5).to_string(); 
// Prints 111111111011 
+0

負の数は必ずしも2の補数として格納されるとは限りません。 –

0

std::bitsetのコンストラクタを見てください。見つかると、符号付き整数を受け入れるコンストラクタはありません。唯一の整数コンストラクタは、unsigned longを受け入れるコンストラクタです。

整数を渡すと、まずunsignedに変換されます。変換された値は、符号なし型の最大値を法とする符号付きのものと同じ正の値になります。

関連する問題