1

以下がうまくいかない理由を誰か説明できますか?

#include <iostream>
#include <string>
#include <sstream>
#include <bitset>

using namespace std;

int main()
{
string tempString;
uint64_t tempValue;

cout << "enter addr in hex : ";
cin >> tempString;
istringstream ost(tempString);
ost >> hex >> tempValue;
bitset<64>  addr(tempValue);
cout << "addr = " << addr << endl;
}

ビットセットの下位 32 ビットのみが正しく設定されます。最上位ビットは 0 のままです。uint64_t の代わりに unsigned long long も使用してみました。

Windows Vista と、最近インストールされたばかりの code::blocks エディターを使用しています。

Windows XP を実行している別のマシンに code::blocks をインストールしようとしましたが、問題は同じです。

編集 2 --

コードを次のように変更しました

#include <iostream>
#include <string>
#include <sstream>
#include <bitset>

using namespace std;

int main()
{
string tempString;
uint64_t tempValue;

cout << "enter addr in hex : ";
cin >> tempString;
istringstream ost(tempString);
if (ost >> hex >> tempValue) cout << "ok" << endl; else cout << "bad" << endl;
ost >> hex >> tempValue;
cout << tempValue << endl;
bitset<64>  addr(tempValue);
cout << "addr = " << addr << endl;
}

そして今、入力ffffffffffすると出力が得られます

ok
1099511627775
addr = 0000000000000000000000000000000011111111111111111111111111111111

ありがとう。

4

1 に答える 1

0

C++03 コンパイラを使用しています。C++03 では、bitsetコンストラクターはunsigned longパラメーターを受け取りますが、これはプラットフォームでは 32 ビットであるため、上位ビットが失われます。

C++11 では、これは を取るように変更されたunsigned long longため、コードは機能します。long64ビットのプラットフォームでも動作します。

64 ビット整数をバイナリ表現の文字列または に変換するには、別の方法を使用する必要がありstd::bitsetます。たとえば、すべてのビットを対象とするループです。

ビットセットを 2 つの部分で構成することもできます。

set::bitset<64> bs = (std::bitset<64>(val >> 32) << 32)  | 
                     std::bitset<64>(val & 0xffffffff);
于 2013-08-21T11:30:53.453 に答える