我想在不使用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。
答案 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}