如何使用左移运算符为大功率计算2的幂?

时间:2015-10-02 16:57:52

标签: c#

我想在不使用Math.Pow的情况下计算2的幂,因为我想避免使用double。所以我需要一个完整的整数值。我以为我可以使用左移操作符但是当我的功率超过30时,它给出了功率31的负数,以及大于31的功率的1。

我的方法看起来像

    public static long TwoPowX(int power)
    {
        return (1 << power);
    }

有什么想法吗?还是替代方法?

编辑: 我需要高达96或更高的功率。

2 ^ 96 = 79,228,162,514,264,337,593,543,950,336。

3 个答案:

答案 0 :(得分:4)

文字1是一个int,因此在转换为long之前,整个表达式(1 << power)也将被计算为int和overflow。请改用1L

public static long TwoPowX(int power)
{
    return (1L << power);
}

答案 1 :(得分:1)

最大功率是多少? 由于int由32位(正数为31位)组成,因此会出现溢出。

你可以使用long代替,但请记住,最大值将是63的幂。

return (long) 1 << power;

答案 2 :(得分:1)

I found a solution, instead of long (Int64) which goes to maximum of power 63, I used BigInteger from System.Numerics

    public static BigInteger TwoPowX(int power)
    {
        return ((BigInteger)1 << power);
    }

and then usage

    BigInteger test = Utility.TwoPowX(96);

yields the correct value for powers greater than 63 (in this example - power of 96)

{79228162514264337593543950336}