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;
对于相同类型的工作完全正常。
答案 0 :(得分:4)
这是因为将这么多位向左移位很少有用。它有点定义浮点表示(使用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