长-长的二进制表示

Binary representation of a long long

本文关键字:表示 二进制      更新时间:2023-10-16

因此,我一直在使用位字符串,在旅行中,我需要以二进制形式显示此long-long。变量具有正确的值,如第一个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;
}

输出为:429496755100000000000000000000000011111111

根据http://www.cplusplus.com/reference/bitset/bitset/bitset/,您尝试使用的std::bitset构造函数只使用unsigned long,在您的系统上,它可能只有32位。其他系统的unsigned long为64位,因此其他系统可能看不到此问题(请尝试打印出sizeof(unsigned long))。

只有真正的解决方案是从truncator的低32位构建位集,并手动设置其余的位。

编写自己的函数将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;
 }

位集处理64位参数的方式因编译器而异。某些Visual Studio版本接受长长度,而其他编译器则只接受32位长度,即使它们有64位长度可用。不过,打印出二进制表示应该不难。很简单,在我的头顶上,未经测试。。

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