为什么uint128_t没有位移位过载uint128_t?

Why doesn't uint128_t have bit shift overloads for uint128_t?

本文关键字:uint128 为什么      更新时间:2023-10-16

当两个操作数都是uint128_t时,boost::multiprecision::uint128_t的左/右移位操作符似乎没有过载:

uint128_t operator<<(uint128_t, uint128_t); // Missing
uint128_t operator>>(uint128_t, uint128_t); // Also Missing

示例代码:

#include <boost/multiprecision/cpp_int.hpp>
int main() {
    using uint128_t = boost::multiprecision::uint128_t;
    uint128_t number = 100;
    uint128_t ten = 10;
    auto leftShift = number << ten;  // fail
    auto rightShift = number >> ten; // fail
    return 0;
}

这是一个演示。

错误消息很长,所以下面是左移操作符的(修改过的)第一条消息:

prog.cpp:8:26: error: no match for 'operator<<' (operand types 
                      are 'uint128_t {aka boost_template_typedef_for_uint128_t}' 
                      and 'uint128_t {aka boost_template_typedef_for_uint128_t}')
  auto leftShift = number << ten;  // fail

您可以查看演示以获得完整的错误消息。

为什么会这样?我看不出他们不被实现的理由,因为unsigned a = 100u << 2u;对于相同的类型工作得很好。

这是因为向左移动这么多位很少有用。它定义了浮点表示(使用cpp_dec_float或类似的)。

这里有一个解决方法:

Live On Coliru

#include <boost/multiprecision/integer.hpp>
#include <boost/multiprecision/cpp_int.hpp>
#include <iostream>
int main() {
    boost::multiprecision::uint128_t v("1"), u("20");
    v = v << u.convert_to<size_t>();
    std::cout << v;
}

打印

1048576