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

输入 #1

1314520

输出 #1

249036820

代码实现

#include <iostream>
using namespace std;

int main() {
    unsigned int x;
    cin >> x; // 输入一个小于 2^32 的非负整数

    // 获取低16位和高16位
    unsigned int low = x & 0xFFFF;      // 低16位
    unsigned int high = x >> 16;        // 高16位

    // 交换高低位
    unsigned int result = (low << 16) | high;

    cout << result << endl; // 输出结果
    return 0;
}

详细解释

  1. 输入
    • 我们从标准输入读取一个整数 x
  2. 获取低 16 位
    • 使用 x & 0xFFFF 获取 x 的低 16 位。0xFFFF 是一个 16 位全 1 的掩码,它的二进制形式是 1111 1111 1111 1111,与 x 做按位与运算后,保留 x 的低 16 位,其他高位会被清除。
  3. 获取高 16 位
    • 使用 x >> 16x 右移 16 位,得到高 16 位。这个操作相当于去掉低 16 位,只保留高 16 位。
  4. 交换高低位
    • 将低 16 位通过 low << 16 左移 16 位,放到高 16 位的位置。
    • 将高 16 位直接放到结果的低 16 位。
    • 使用按位或操作 | 将两部分合并成最终结果。
  5. 输出
    • 输出交换后得到的结果。

另解

#include <bits/stdc++.h>
using namespace std;
int main() {
    long long n;
    cin>>n;
    long long res=(n<<16)+(n>>16);
    cout<<res;
}
posted @ 2025-02-16 23:45  ToFuture$  阅读(64)  评论(0)    收藏  举报