洛谷 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;
}
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6