翻转整数二进制位是镜像对调位置而非取反:如8位10110010翻转为01001101;需分治法逐级交换相邻位、两位、四位等,配合掩码与移位,Python中须用&0xFFFFFFFF截断并用'032b'验证。

直接翻转一个整数的全部二进制位(比如32位),不是只改某一位,而是让最低位变最高位、最高位变最低位——这需要分步位移+掩码组合,不能靠单个操作符一步到位。
理解“翻转二进制序列”的真实含义
它不是取反(~),也不是异或(^),而是**镜像对调位置**:
例如 8 位数 10110010 翻转后是 01001101。
关键点在于:
- 每一位的权重发生根本变化(原第0位变成第7位,原第3位仍对应第4位)
- 必须保留总位宽(如32位整数就要补足前导零再翻,否则 Python 的 bin() 会省略)
- 符号位参与翻转,但结果是否为负,取决于翻转后最高位是否为1(即新值的补码解释)
经典分治法:用移位+掩码逐级交换
以 8 位为例,可拆解为三步,每步交换更大粒度的块:
-
交换相邻位:用掩码
0xAA(10101010)提取奇数位右移,0x55(01010101)提取偶数位左移,再或起来 -
交换相邻两位:用掩码
0xCC(11001100)和0x33(00110011),分别右移/左移2位后合并 -
交换相邻四位:直接
(n & 0xF0) >> 4 | (n & 0x0F)
推广到 32 位,只需再加两步:交换相邻八字节(即高低16位互换)、最后整体左右半区交换。Java 的 Integer.reverse() 和 C 的标准实现都采用这种思路,时间复杂度 O(log n),无循环依赖。
一行式技巧:适用于已知位宽的快速实现
若限定 32 位无符号整数,可用预计算查表 + 移位拼接,但更通用的代码写法是:
result = ((n & 0x55555555) > 1)
result = ((result & 0x33333333) > 2)
result = ((result & 0x0F0F0F0F) > 4)
result = (result > 8) & 0xFF00) | (result >> 24)
每行对应一级交换,掩码确保只操作目标位段,避免干扰。注意 Python 中需用 & 0xFFFFFFFF 截断高位,防止负数扩展影响结果。
验证与调试建议
翻转后务必用固定宽度输出比对:
- 用
format(n, '032b')查看 32 位二进制字符串,避免bin()省略前导零 - 对已知小数值手动演算(如 n=1 → 32位是
000...001,翻转后应为100...000即 2³¹) - 负数翻转后仍是合法补码,无需特殊处理;例如 -1(全1)翻转后仍是全1,值不变










