我正在尝试将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,字符串为零。
这里的任何帮助都会非常感激。
答案 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
作为构造函数中的类型。