这是一串代码
#include<bits/stdc++.h>
typedef long long ll;
ll a[35],b[35];
int main(){
a[0]=b[0]=1;
for(int i=1;i<32;i++)a[i]=(1<<i);
for(int i=1;i<32;i++)b[i]=b[i-1]<<1;
return 0;
}
仿佛\(a,b\)两个数组是一样的,\(a_i=b_i=2^i\)
但是输出后:
for(int i=0;i<32;i++)printf("a[%02d] = %-12lld ,b[%02d] = %-12lld\n",i,a[i],i,b[i]);
细看最后一行,我们发现,使用位运算时,1<<31
为负数,这是为什么?
实际上,真实原因是,在C++中,1是一个int类型的数
我们只需要将代码改为:
#include<bits/stdc++.h>
typedef long long ll;
ll a[35],b[35];
int main(){
a[0]=b[0]=1;
for(int i=1;i<32;i++)a[i]=(a[0]<<i);
for(int i=1;i<32;i++)b[i]=b[i-1]<<1;
printf("\n");
for(int i=0;i<32;i++)printf(" a[%02d] = %-12lld ,b[%02d] = %-12lld\n",i,a[i],i,b[i]);
return 0;
}
那么一切就恢复正常了: