2

所以我一直在用按位字符串做一些工作,在我的旅行中,我需要以二进制形式显示这个 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;
}

输出为:4294967551 00000000000000000000000011111111

4

3 回答 3

3

根据http://www.cplusplus.com/reference/bitset/bitset/bitset/std::bitset您尝试使用的构造函数仅使用 a unsigned long,在您的系统上,它可能只有 32 位。其他系统unsigned long是 64 位的,所以其他人可能看不到这个问题(尝试打印出来sizeof(unsigned long))。

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

于 2013-07-29T19:08:03.500 回答
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;
 }
于 2013-07-29T19:18:00.190 回答
-1

bitset 处理 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());
于 2013-07-29T19:19:33.180 回答