C ++左移大值

时间:2016-02-19 13:19:10

标签: c++ shift

我很想知道如何在C ++中改变左边的值。 例如:

1 << 180

我认为结果应该是:

1532495540865888858358347027150309183618739122183602176

(在python [1&lt; <180]中测试);

4 个答案:

答案 0 :(得分:6)

Python支持任意精度算术,C ++不支持。

此外,根据标准 [expr.shift]

  

如果右操作数为负数或更大,则行为未定义   大于或等于提升的左操作数的位数。

为了在C ++中使用大整数,你可以使用Boost库,它通过长算术实现为不同的库提供包装:

#include <boost/multiprecision/gmp.hpp>
#include <iostream>

int main()
{
    boost::multiprecision::mpz_int one(1);
    std::cout << (one << 180) << std::endl;
    return 0;
}

打印

1532495540865888858358347027150309183618739122183602176

答案 1 :(得分:6)

您可以使用std::bitset

执行此操作
std::bitset<200> bits = 1; // 200 bits long
bits <<= 180;

这有多大取决于你想用它做什么。它无法转换为单个内置类型,因为它们不够大。但是还可以在其上执行其他可能有用的操作。

答案 2 :(得分:1)

在C ++中(如在C中),左移一个大于移位操作数类型中位数的值实际上给出了未定义的行为。

在这种情况下,您正在移动一个int值,该值最有可能是32位大小的值,大于32,因此行为未定义。

如果您需要处理机器上大于字大小的整数,您可能需要使用库。 GMP是一种选择。

答案 3 :(得分:0)

整数(或长整数)以32位存储,因此不能移位180。 如果您需要确切的值,请尝试编写/下载管理大整数的类。 否则,请使用double并调用pow(2,180)。它具有15位数的精度