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
作为构造函数中的类型。
我正在尝试将 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
作为构造函数中的类型。