洛谷 P5250 高低位交换
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
高低位交换
题目描述
给出一个小于 2 32 2^{32} 232 的非负整数。这个数可以用一个 32 32 32 位的二进制数表示不足 32 32 32 位用 0 0 0 补足。我们称这个二进制数的前 16 16 16 位为“高位”后 16 16 16 位为“低位”。将它的高低位交换我们可以得到一个新的数。试问这个新的数是多少用十进制表示。
例如数 1314520 1314520 1314520 用二进制表示为 0000 0000 0001 0100 0000 1110 1101 1000 0000\,0000\,0001\,0100\,0000\,1110\,1101\,1000 00000000000101000000111011011000添加了 11 11 11 个前导 0 0 0 补足为 32 32 32 位其中前 16 16 16 位为高位即 0000 0000 0001 0100 0000\,0000\,0001\,0100 0000000000010100后 16 16 16 位为低位即 0000 1110 1101 1000 0000\,1110\,1101\,1000 0000111011011000。将它的高低位进行交换我们得到了一个新的二进制数 0000 1110 1101 1000 0000 0000 0001 0100 0000\,1110\,1101\,1000\,0000\,0000\,0001\,0100 00001110110110000000000000010100。它即是十进制的 249036820 249036820 249036820。
输入格式
一个小于 2 32 2^{32} 232 的非负整数
输出格式
将新的数输出
样例 #1
样例输入 #1
1314520
样例输出 #1
249036820
一道水题这里我是简单的模拟了一下正解应该是用位运算来求解。
#include<iostream>
#include<cmath>
using namespace std;
typedef long long ll;
int num[35],num1[35];
int main()
{
ll n;
cin>>n;
for(int i=32;i>=1;i--)
{
num[i]=n%2;
n/=2;
}
ll ans = 0;
for(int i=1;i<=16;i++) num1[i]=num[i+16];
for(int i=17;i<=32;i++) num1[i]=num[i-16];
for(int i=1;i<=32;i++)
{
ans+=pow(2,32-i)*num1[i];
}
cout<<ans;
return 0;
}