You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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),但当前代码输出不符合预期。

问题分析

  1. 类型溢出:rev被定义为int类型,当反转后的结果最高位为1时,int会因符号位规则变成负数,转为long返回时会保留负号,与无符号32位整数的预期结果不符。
  2. 移位符号扩展错误:1<<f中的1是int类型,当f=31时,左移31位会得到Integer.MIN_VALUE(-2147483648),与long类型的n做与运算时,该int值会被符号扩展为高32位全1的long值,导致与运算结果错误。
  3. 未过滤高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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 05:40:28