十六进制输入到位集< 64> C ++

时间:2013-08-21 10:18:02

标签: c++ hex bitset

有人可以解释为什么以下这些对我不起作用吗?

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

仅正确设置了bitset的最低32位。最高位保持为0.我也尝试使用unsigned long long代替uint64_t。

我使用的是windows vista和最近才安装的code :: blocks编辑器。

我尝试将code :: blocks安装到我运行windows xp的另一台机器上,问题是一样的。

编辑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

感谢。

1 个答案:

答案 0 :(得分:0)

您正在使用C ++ 03编译器。在C ++ 03中,bitset构造函数采用unsigned long参数,在您的平台上为32位,因此您丢失了高位。

在C ++ 11中,这被改为采用unsigned long long,因此您的代码将起作用。它也适用于long为64位的平台。

您需要使用不同的方法将64位整数转换为二进制表示字符串或std::bitset,例如循环遍历所有位。

您还可以将比特集分为两部分构建:

set::bitset<64> bs = (std::bitset<64>(val >> 32) << 32)  | 
                     std::bitset<64>(val & 0xffffffff);