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

Java连续零字节序列计数程序问题求助:输出结果缺失预期值

问题分析与解决方案

你的问题出在mask的类型和右移时的符号扩展上!

你定义mask为byte类型,而byte是有符号整数,范围是-128到127。当你初始设置mask = (byte)128时,这个值其实是-128(因为128超出了byte的正数范围,二进制10000000作为有符号byte表示-128)。之后每次执行mask >> 1(有符号右移),负数的右移会填充符号位1,导致mask变成-64、-32、-16、-8……这些负数的二进制是高位全1的形式,和n按位与时结果不为0,错误地被你判定为该位是1,从而漏掉了中间的零序列。

比如处理55(二进制00110111)时,当mask变成(byte)-8(二进制11111000),55 & -8的结果是48(不为0),你的代码会认为这一位是1,但实际上这一位对应的是8的位置,二进制是0,本该让zeros加1的,结果直接重置了zeros,导致中间的1个零没被统计到。

修改后的代码

把mask改成int类型(避免符号扩展),同时调整循环次数为8次(因为byte只有8位,不需要循环9次):

import java.util.Scanner;
class Main {
    public static void main(String[] args) {
        System.out.print("input number:");
        Scanner sc = new Scanner(System.in);
        byte n = sc.nextByte();
        sc.close();
        int mask = 128; // 用int类型,避免符号扩展问题
        int result;
        int zeros = 0;
        System.out.println("result:");
        // byte是8位,循环8次即可覆盖所有位
        for(int i=0; i<8; i++) {
            result = n & mask;
            result = result != 0 ? 1 : 0;
            if (result == 0) {
                zeros++;
            } else {
                if (zeros != 0) {
                    System.out.print(zeros+" ");
                }
                zeros = 0;
            }
            mask = mask >> 1; // int正数右移填充0,不会变成负数
        }
    }
}

验证结果

输入55后,代码会正确输出2 1,符合你的预期。

额外优化(可选)

如果需要统计数字末尾的连续零(比如输入56,二进制00111000,末尾有3个零),可以在循环结束后添加一段代码,输出剩余的zeros:

// 循环结束后检查是否有未输出的末尾零序列
if (zeros != 0) {
    System.out.print(zeros);
}

内容的提问来源于stack exchange,提问作者Leksus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 12:12:27