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;
}
详细解释
- 输入:
- 我们从标准输入读取一个整数
x。
- 我们从标准输入读取一个整数
- 获取低 16 位:
- 使用
x & 0xFFFF获取x的低 16 位。0xFFFF是一个 16 位全 1 的掩码,它的二进制形式是1111 1111 1111 1111,与x做按位与运算后,保留x的低 16 位,其他高位会被清除。
- 使用
- 获取高 16 位:
- 使用
x >> 16将x右移 16 位,得到高 16 位。这个操作相当于去掉低 16 位,只保留高 16 位。
- 使用
- 交换高低位:
- 将低 16 位通过
low << 16左移 16 位,放到高 16 位的位置。 - 将高 16 位直接放到结果的低 16 位。
- 使用按位或操作
|将两部分合并成最终结果。
- 将低 16 位通过
- 输出:
- 输出交换后得到的结果。
另解
#include <bits/stdc++.h>
using namespace std;
int main() {
long long n;
cin>>n;
long long res=(n<<16)+(n>>16);
cout<<res;
}
浙公网安备 33010602011771号