如何创建128位整数文本
How to create a 128-bit integer literal?
我有一个格式为0x75f17d6b3588f843b13dea7c9c324e51
的整数文本。有没有办法避免编译器语法错误"integer literal太大,无法用任何整数类型表示"?
因为我知道我可以处理这些类型(我使用EOS库中的uint128_t
,如果我手动插入它,它就可以工作(。
有没有一种方法可以在运行时将这个字符串直接解析为完全相同的整数?
您可以为128位整数编写用户定义的文字(自C++11以来(。
原始文字运算符采用单个const char*
作为参数。然后,您可以编写一个函数体来解析字符串。
例如:
// Use __uint128_t for demonstration.
constexpr __uint128_t operator""_uint128_t(const char* x)
{
__uint128_t y = 0;
for (int i = 2; x[i] != ' '; ++i)
{
y *= 16ull;
if ('0' <= x[i] && x[i] <= '9')
y += x[i] - '0';
else if ('A' <= x[i] && x[i] <= 'F')
y += x[i] - 'A' + 10;
else if ('a' <= x[i] && x[i] <= 'f')
y += x[i] - 'a' + 10;
}
return y;
}
显然,这个实现是有问题的,因为我太懒了,无法开发完整的解决方案,它只支持十六进制,不检查0x
前缀,等等。它需要C++14宽松的constexpr
函数。但它表明,您实际上可以将这个字符串直接解析为完全相同的整数。
让我们测试一下:
int main()
{
auto abc = 0x1234567890ABCDEFfedcba0987654321_uint128_t;
std::uint64_t higher = abc >> 64;
std::uint64_t lower = abc;
std::cout << std::hex << higher << ' ' << lower;
}
http://coliru.stacked-crooked.com/a/fec4fc0fd4ff1418
128位整数文本不是标准强制要求的,因此,是否允许它们取决于实现。大多数都没有,所以你需要将其分解为两个64位组件,并使用逐位运算符将它们组合起来:
__uint128_t num = ((__uint128_t)0x75f17d6b3588f843 << 64) | 0xb13dea7c9c324e51;
一个好的编译器应该在编译时执行操作。
相关文章:
- 如何打印boost多精度128位无符号整数
- 使用英特尔内联函数将打包的 8 位整数乘以浮点数向量
- 如何对__uint128_t进行位扫描(128位)?
- 从两个 4x64 位整数数组中获取取模
- 在 c++ 中输出 64 位整数
- 如何在C ++中将二进制字符串128位转换为十进制字符串?
- 使用192/256位整数求和无符号64位整数向量的点积的最快方法
- 在 64 位整数内旋转(90°)位矩阵(最多 8x8 位)
- 使用 AVX2 指令左移 128 位数字
- 如何通过COM接口将64位整数从C++发送到C#
- GMP-将64位整数存储在mpz_t/mpz_class中,并返回64位整数
- 如何创建128位整数文本
- 编译器用于编译 128 位整数的基本算术运算的技巧
- 优化 32 位架构上的可移植 128 位整数移位
- 如何在 c++ 中输入 128 位无符号整数
- 计算128位整数中前导零的数量
- 一种在C++中执行基本 128 位整数计算的有效方法
- C++中有 128 位整数吗?
- x86上两个128位整数的高效乘法/除法(无64位)
- visual studio 6中的128位整数