用掩码取出低 16 位并左移,同时把高 16 位右移,再按位或合并。
OJ: luogu
题目 ID: P1100
难度:入门
标签:位运算掩码python
日期: 2026-07-16 19:20
题意
把一个 32 位无符号整数的高 16 位与低 16 位交换,输出新整数。
思路
number>>16 把高半部分移动到低位;number&0xFFFF 只保留低 16 位,再左移 16 位。两部分没有重叠,用按位或合并:
text
(number >> 16) | ((number & 0xFFFF) << 16)Python 知识
- 十六进制字面量
0xFFFF正好是 16 个二进制1。 &是按位与掩码,<<、>>是位移,|合并位段。- Python 整数没有固定 32 位,但输入范围保证上述结果与无符号 32 位运算一致。
- 一行表达式已完整表达算法,不需要额外函数。
/home/rainboy/mycode/hugo-blog/content/program_language/python/cpp_to_python_pitfalls.md:Python 与 C++ 固定位宽整数差异。
代码
python
number = int(input())
print((number >> 16) | ((number & 0xFFFF) << 16))cpp
/**
* P1100 高低位交换
* Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
* rbook: -> https://rbook.roj.ac.cn
* rainboy的学习导航网站: https://idx.roj.ac.cn
* create_at: 2026-07-27 00:00
* update_at: 2026-07-27 00:00
*/
#include <bits/stdc++.h>
using namespace std;
int main() {
unsigned int n;
scanf("%u", &n);
// 低 16 位左移、高 16 位右移,然后合并
unsigned int ans = (n >> 16) | (n << 16);
printf("%u\n", ans);
return 0;
}Pythonic 写法
位运算高低互换:
python
x = int(input())
print((x >> 16) | ((x & 0xFFFF) << 16))复杂度
固定次数位运算,时间和额外空间复杂度均为
总结
位段操作的标准步骤是“掩码取出、位移到位、按位或合并”。