1. 程式人生 > 實用技巧 >洛谷-P1100 高低位交換

洛谷-P1100 高低位交換

洛谷-P1100 高低位交換

原題連結:https://www.luogu.com.cn/problem/P1100


題目描述

給出一個小於\(2^{32}\)的正整數。這個數可以用一個\(32\)位的二進位制數表示(不足\(32\)位用\(0\)補足)。我們稱這個二進位制數的前\(16\)位為“高位”,後\(16\)位為“低位”。將它的高低位交換,我們可以得到一個新的數。試問這個新的數是多少(用十進位制表示)。

例如,數\(1314520\)用二進位制表示為\(0000 0000 0001 0100 0000 1110 1101 1000\)(添加了\(11\)個前導\(0\)補足為\(32\)

位),其中前\(16\)位為高位,即\(0000 0000 0001 0100\);後\(16\)位為低位,即\(0000 1110 1101 1000\)。將它的高低位進行交換,我們得到了一個新的二進位制數\(0000 1110 1101 1000 0000 0000 0001 0100\)。它即是十進位制的\(249036820\)

輸入格式

一個小於\(2^{32}\)的正整數

輸出格式

將新的數輸出

輸入輸出樣例

輸入 #1

1314520

輸出 #1

249036820

C++程式碼

#include <iostream>
#include <cmath>
using namespace std;

int a[35];

int main() {
    long long n, m=0;
    cin >> n;
    for (int i=32; i>0&&n!=0; --i) {
        a[i] = n % 2;
        n /= 2;
    }
    for (int i=16; i>0; --i)
        m += a[i] * pow(2, 16-i);
    for (int i=32; i>16; --i)
        m += a[i] * pow(2, 48-i);
    cout << m << endl;
    return 0;
}