bitset不使用某些数字

时间:2017-03-02 19:38:25

标签: c++ bitset

我正在尝试将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模块。 分销商ID: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 

这台机器的代码相同。 分销商ID:CentOS 描述:CentOS 6.8版(最终版) 发布:6.8 代号:最后

g ++(GCC)4.4.7 20120313(Red Hat 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,字符串为零。

这里的任何帮助都会非常感激。

1 个答案:

答案 0 :(得分:1)

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

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