C++ 长序列的二进制表示

C++ 长序列的二进制表示,c++,bit-manipulation,iostream,C++,Bit Manipulation,Iostream,所以我一直在做一些关于位字符串的工作,在我的旅行中,我需要以二进制形式显示这个长字符串。变量具有正确的值,如第一栏所示。但是,当它以二进制显示时,会丢失一个“1”。你知道这是什么原因吗 #include <iostream> #include <bitset> using namespace std; int main(){ long long truncator=4294967551ll; cout<<truncator<<"

所以我一直在做一些关于位字符串的工作,在我的旅行中,我需要以二进制形式显示这个长字符串。变量具有正确的值,如第一栏所示。但是,当它以二进制显示时,会丢失一个“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;
}
#包括
#包括
使用名称空间std;
int main(){
长截断器=4294967551ll;
cout根据,您尝试使用的
std::bitset
构造函数只使用了
无符号长
,在您的系统上,它可能只有32位。其他系统的
无符号长
为64位,因此其他系统可能看不到这个问题(请尝试打印
sizeof(unsigned long)


唯一真正的解决方法是从
截断器的低位32位构造位集,并手动设置其余的位。

编写自己的函数将
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;
 }
string convertToBitString(长值)
{
字符串str(64,'0');
对于(int i=0;i<64;i++)
{

if((1ll位集处理64位参数的方式因编译器而异。某些Visual Studio版本接受long-long,而其他编译器仅接受32位long,即使它们有64位long-long可用。但打印二进制表示形式应该不难。简单,我不知道,未经测试

string str;
do
{
    str += ((truncator&1)?'1':'0');
} while (--truncator);
reverse(str.begin(), str.end());

您能提供您在问题中看到的输出吗?
string s=b.to_string();根据请求添加的输出是否正确也适用于Visual Studio Ultimate 2012…您使用的编译器是什么?可能尝试使用
b.to_string()
?在windows中,long是32位长的,在类似unix的系统中long是指针大小,两个构造函数的long都是64位长的,根据它是一个无符号的long long或string,这可能是在C++0x中修复的-此外,我看到的行为暗示,他最终调用的构造函数只接受32位尼尔·柯克解决了这个问题。