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
相关产品推荐
相关产品推荐

