高低位交换

GitHub跳转原题关系图返回列表

用掩码取出低 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))

复杂度

固定次数位运算,时间和额外空间复杂度均为 O(1)O(1)

总结

位段操作的标准步骤是“掩码取出、位移到位、按位或合并”。