bitset 不适用于某些数字

bitset not working with some numbers

我正在尝试将 8 字节宽的数字转换为位串。

#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <bitset>
     void getAsString(int64_t mask )
    {
        printf("mask = %lld\n", mask);
        std::string test = std::bitset< 64 >( mask ).to_string();
        printf("test = %s \n", test.c_str() );
    }

    int main()
    {
        int64_t allowedBits[4] = { 0x0000000000000001L, 0x0000000000010000L, 0x0000000100000000L, 0x0001000000000000L };
        for (int i = 0; i < 4; ++i)
        {
            getAsString(allowedBits[i]);
        }
    }

下面是 Linux 机器

上的输出

没有可用的 LSB 模块。 经销商编号:Ubuntu 说明:Ubuntu 16.04 LTS 发布:16.04 代号:xenial g++ (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609

mask = 1
test = 0000000000000000000000000000000000000000000000000000000000000001 
mask = 65536
test = 0000000000000000000000000000000000000000000000010000000000000000 
mask = 4294967296
test = 0000000000000000000000000000000100000000000000000000000000000000 
mask = 281474976710656
test = 0000000000000001000000000000000000000000000000000000000000000000 

本机代码相同。 发行商编号:CentOS 说明:CentOS 6.8 版(最终版) 发布:6.8 代号:Final

g++ (GCC) 4.4.7 20120313(红帽 4.4.7-17)

给出以下输出

mask = 1
test = 0000000000000000000000000000000000000000000000000000000000000001
mask = 65536
test = 0000000000000000000000000000000000000000000000010000000000000000
mask = 4294967296
test = 0000000000000000000000000000000000000000000000000000000000000000
mask = 281474976710656
test = 0000000000000000000000000000000000000000000000000000000000000000

我检查了 int64_t 的宽度。两台机器都是 8。 对于掩码 4294967296 和 281474976710656,字符串为零。

如有任何帮助,我们将不胜感激。

根据您的编译器版本 (gcc-4.4.7),代码可能正在使用未更新的库来处理 C++11。 std::bitset<N> 构造函数的 C++11 之前的规范使用了整数 unsigned long。对于 32 位构建 unsigned long 使用 32 位。因此,参数在传递给 std::bitset<N> 的构造函数之前将被截断。

我确认 libstdc++ 与 gcc-4.4.7 一起发布确实使用 unsigned long 作为构造函数中的类型。