Java实现32位整数位反转代码不符测试用例,求排查
32位整数位反转实现问题
我在解决Java中32位整数的位反转问题时,写了如下代码,但运行结果和测试用例不符:
public class Solution { public static long reverseBits(long n) { int f=31; int l=0; int rev=0; while(f>l){ if((n&(1<<f))!=0){ rev=rev|(1<<l); } if((n&(1<<l))!=0){ rev=rev|(1<<f); } f--; l++; } return rev; } }
测试用例输入为43261596(二进制对应00000010100101000001111010011100),期望输出为964176192(二进制对应00111001011110000010100101000000),但当前代码输出不符合预期。
问题分析
- 类型溢出:
rev被定义为int类型,当反转后的结果最高位为1时,int会因符号位规则变成负数,转为long返回时会保留负号,与无符号32位整数的预期结果不符。 - 移位符号扩展错误:
1<<f中的1是int类型,当f=31时,左移31位会得到Integer.MIN_VALUE(-2147483648),与long类型的n做与运算时,该int值会被符号扩展为高32位全1的long值,导致与运算结果错误。 - 未过滤高32位:输入参数
n是long类型,可能包含高32位的无效数据,未做过滤会影响位运算结果。
修正后的代码
方案一:逐位处理(更直观)
public class Solution { public static long reverseBits(long n) { // 仅保留低32位,确保处理的是32位整数 n = n & 0xFFFFFFFFL; long rev = 0; for (int i = 0; i < 32; i++) { // 取出n的第i位,放到rev的第(31-i)位 rev |= ((n >> i) & 1) << (31 - i); } // 返回无符号32位反转结果 return rev; } }
方案二:基于原交换思路修正
public class Solution { public static long reverseBits(long n) { // 过滤高32位 n = n & 0xFFFFFFFFL; int f = 31; int l = 0; long rev = 0; while (f > l) { // 使用1L确保移位操作是long类型,避免符号扩展 if ((n & (1L << f)) != 0) { rev |= (1L << l); } if ((n & (1L << l)) != 0) { rev |= (1L << f); } f--; l++; } return rev; } }
内容的提问来源于stack exchange,提问作者Lakshya Gupta
相关产品推荐
相关产品推荐

