给出一个小于2的32次方的非负整数。这个数可以用一个32位的二进制数表示(不足32位用0补足)。我们称这个二进制数的前16位为“高位”,后16位为“低位”。将它的高低位交换,我们可以得到一个新的数。试问这个新的数是多少(用十进制示)。
例如,数 13145201314520 用二进制表示为 0000000000010100000011101101000(添加了11个前导0补足为32位),其中前16位为高位,即0000000000010100;后16位为低位,即0000111011011000。将它的高低位进行交换,我们得到了一个新的二进制数00001110110110000000000000010100。它即是十进制的249036820。
一个小于2的32次方的非负整数
将新的数输出
1314520
249036820
#include<bits/stdc++.h>
using namespace std;
int n,a[32],p=31,b[32],c[16],d[16],x=2,zh2[105],ans=0,w=1;
void zh1(int k){
if(k>=2){
zh1(k/2);
k%=2;
a[p]=k;
p--;
}else{
a[p]=k;
p--;
}
return;
}
int main(){
cin>>n;
for(int i=0;i<16;i++)c[i]=d[i]=a[i]=b[i]=0;
for(int i=16;i<32;i++)a[i]=b[i]=0;
zh1(n);
for(int i=31,j=30-p;i>p;i--,j--)b[j]=a[i];
cout<<endl;
for(int i=31,j=0;i>15;i--,j++)c[j]=b[i];
for(int i=15,j=0;i>=0;i--,j++)d[j]=b[i];
for(int i=0;i<=15;i++)a[i]=d[i];
for(int i=0,j=16;i<=15;i++,j++)a[j]=c[i];
for(int i=31;i>=0;i--)zh2[31-i]=a[i]-'0';
for(int i=0;i<33;i++){
ans+=w*zh2[i];
w*=x;
}
cout<<ans;
return 0;
}