长期的二进制表示

时间:2013-07-29 18:56:55

标签: c++ bit-manipulation iostream

所以我一直在使用按位字符串进行一些工作,在我的旅行中,我需要以二进制形式显示这么久。变量具有正确的值,如第一个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

3 个答案:

答案 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());