所以我一直在使用按位字符串进行一些工作,在我的旅行中,我需要以二进制形式显示这么久。变量具有正确的值,如第一个cout中所示。但是,当它以二进制显示时,缺少“1”。是什么原因引起了这个?
#include <iostream>
#include <bitset>
using namespace std;
int main(){
long long truncator=4294967551ll;
cout<<truncator<<"\n";
std::bitset<64> b(truncator);
cout<<b;
return 0;
}
输出是: 4294967551 00000000000000000000000011111111
答案 0 :(得分:3)
根据http://www.cplusplus.com/reference/bitset/bitset/bitset/,您尝试使用的std::bitset
构造函数仅使用unsigned long
,在您的系统上,unsigned long
可能只有32位。其他系统的sizeof(unsigned long)
为64位,因此其他系统可能无法看到此问题(尝试打印truncator
)。
对此唯一真正的修复是从{{1}}的低32位构造位集,并手动设置其余位。
答案 1 :(得分:1)
编写自己的函数将long long
转换为字符串:
string convertToBitString(long long value)
{
string str(64, '0');
for(int i = 0; i < 64; i++)
{
if( (1ll << i) & value)
str[63-i] = '1';
}
return str;
}
答案 2 :(得分:-1)
bitset如何处理64位参数在编译器之间有所不同。一些Visual Studio版本接受很长时间,其他编译器只接受32位长,即使它们有64位长的可用时间。打印出二进制表示应该不难。简单,从我的头顶,未经测试..
string str;
do
{
str += ((truncator&1)?'1':'0');
} while (--truncator);
reverse(str.begin(), str.end());