Java中字符串十进制数转二进制:解决重复转换异常问题
问题分析与解决方案
你的推测完全正确,代码出现异常的核心原因有两个:
- 替换顺序错误:循环从0到255遍历,先替换小数字(比如4、8)会把原字符串里的长数字(比如48)拆成片段替换,完全破坏了原始目标数字。
- 无边界匹配:
replaceAll会匹配字符串中所有出现的数字片段,包括已经转换后的二进制字符串里的数字,导致二次替换,最终结果彻底混乱。
最优解决方案:拆分后逐个转换
最稳妥的方式是先把原始字符串拆分成单个十进制数字,逐个转换为二进制后再拼接,完全避免替换冲突:
static String numbers = "48, 40, 6, 82, 222, 94, 152, 46, 77"; public static void main(String[] args) { // 按逗号加空格拆分原始字符串 String[] numArray = numbers.split(", "); StringBuilder result = new StringBuilder(); for (String numStr : numArray) { // 转换为十进制整数 int decimal = Integer.parseInt(numStr); // 转换为二进制字符串 String binary = Integer.toBinaryString(decimal); // 拼接结果(处理逗号分隔) if (result.length() > 0) { result.append(", "); } result.append(binary); } System.out.println(result); }
运行后输出完全符合预期:110000, 101000, 110, 1010010, 11011110, 1011110, 10011000, 101110, 1001101
备选方案:正则匹配+逆序替换
如果一定要保留replaceAll的思路,需要用正则匹配完整的独立数字,并且从大到小遍历(避免短数字先替换破坏长数字):
static String numbers = "48, 40, 6, 82, 222, 94, 152, 46, 77"; public static void main(String[] args) { // 从大到小遍历,优先替换长数字 for (int i = 255; i >= 0; i--) { // 正则单词边界\\b确保匹配完整数字,不会匹配片段 String regex = "\\b" + Integer.toString(i) + "\\b"; numbers = numbers.replaceAll(regex, Integer.toBinaryString(i)); } System.out.println(numbers); }
内容的提问来源于stack exchange,提问作者YahyaB
相关产品推荐
相关产品推荐

