计算2 ^ 32的最简单方法是2*2*2*2*2......= 4294967296
,我想知道有没有其他方法可以获得4294967296? (2^16 * 2^16
被视为与2*2*2....
)
以及计算它的方法有多少? 有没有计算它的功能?
如果没有2*2*2...
答案 0 :(得分:9)
2 << 31
有点转变。它有效地提高了2到32次方。
答案 1 :(得分:1)
如果您使用的是普通计算机,则可以通过2
(即31
)将位移2<<31
留下以获得2 ^ 32。
在标准C中:
unsigned long long x = 2ULL << 31;
unsigned long long
是必需的,因为不能保证简单的unsigned long
足够大以存储2<<31
的值。
在C99标准的 5.2.4.2.1 第1段中
...... 以下内容应替换为与a相同类型的表达式 表达式,它是根据整数转换的相应类型的对象 促销活动。它们的实现定义值的大小(绝对值)应等于或大于显示的值,具有相同的符号。
- 类型为
的对象的最大值unsigned long int
ULONG_MAX 4294967295 //
2^32 - 1
- 类型为
的对象的最大值unsigned long long int
ULLONG_MAX 18446744073709551615 //
2^64 - 1
答案 2 :(得分:1)
选项:
1 << 32
2^32 = (2^32 - 1) + 1 = (((2^32 - 1) + 1) - 1) + 1 = ...
答案 3 :(得分:1)
如果你不喜欢二元魔法,那么我会建议 quickpower 。这个函数在O(logn)
时间计算x n 。
int qpower(int x,int n)
{
if(n==0)return 1;
if(n==1)return x;
int mid=qpower(x,n/2);
if(n%2==0)return mid*mid;
return x*mid*mid;
}
答案 4 :(得分:0)
为什么不使用Math.Pow()
(在.NET中)。我认为大多数语言(或环境)会支持您的类似功能:
Math.Pow(2,32);
答案 5 :(得分:0)
在Groovy / Java中,您可以使用长数字执行以下操作(Java中有符号整数最多可以为2 ^ 31)
long twoPOW32 = 1L << 32;