有人可以解释为什么以下这些对我不起作用吗?
#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
感谢。
答案 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);