1. 概述
本文将系统性地介绍在 Java 中如何将整数以二进制格式输出。内容涵盖:
- 手动实现二进制转换的算法逻辑
- 使用 Java 标准库中的内置方法
- 如何生成固定位数(补零)的二进制字符串
目标是帮你快速掌握这些技巧,避免踩坑,提升编码效率。
2. 手动实现整数转二进制
在使用现成 API 之前,先理解底层原理。整数转二进制的核心是“除2取余,逆序排列”。
✅ 转换步骤:
- 对数字
n
不断除以 2,记录每次的余数 - 将
n
更新为商,重复直到n == 0
- 将所有余数逆序拼接,即为二进制表示
📌 示例:将 7 转为二进制
步骤 | 计算 | 余数 | 商 |
---|---|---|---|
1 | 7 ÷ 2 | 1 | 3 |
2 | 3 ÷ 2 | 1 | 1 |
3 | 1 ÷ 2 | 1 | 0 |
结果 | 逆序余数 | → | 111 |
✅ 代码实现
public static String convertIntegerToBinary(int n) {
if (n == 0) {
return "0";
}
StringBuilder binaryNumber = new StringBuilder();
while (n > 0) {
int remainder = n % 2;
binaryNumber.append(remainder);
n /= 2;
}
binaryNumber = binaryNumber.reverse();
return binaryNumber.toString();
}
⚠️ 注意:该方法只适用于非负整数。负数涉及补码表示,需特殊处理(见后文)。
3. 使用 Integer#toBinaryString 方法
Java 提供了开箱即用的工具方法:Integer.toBinaryString(int)
,简单粗暴,推荐日常使用。
✅ 方法签名
public static String toBinaryString(int i)
✅ 示例
int n = 7;
String binaryString = Integer.toBinaryString(n);
assertEquals("111", binaryString);
⚠️ 负数处理
对于负数,该方法会直接输出其补码形式(32位):
System.out.println(Integer.toBinaryString(-1));
// 输出:11111111111111111111111111111111 (32个1)
如果你只需要逻辑上的“二进制表示”,不建议用于负数场景。
4. 使用 Integer#toString(radix) 方法
Integer.toString(int, int)
是一个更通用的方法,支持任意进制转换。
✅ 方法签名
public static String toString(int i, int radix)
i
:待转换的整数radix
:进制基数,二进制传2
✅ 示例
int n = 7;
String binaryString = Integer.toString(n, 2);
assertEquals("111", binaryString);
✅ 灵活性优势
这个方法不仅限于二进制,还能轻松转八进制、十六进制:
Integer.toString(7, 8); // "7" → 八进制
Integer.toString(7, 16); // "7" → 十六进制
Integer.toString(255, 16); // "ff" → 十六进制
✅ 推荐指数:高。尤其适合需要动态进制转换的场景。
5. 获取 N 位补零的二进制表示
有时我们需要固定位宽的二进制字符串,比如 8 位(字节)、16 位等。例如:
位宽 | 数字 7 的表示 |
---|---|
4-bit | 0111 |
8-bit | 00000111 |
16-bit | 0000000000000111 |
✅ 方案一:String.format + replace
利用格式化字符串先右对齐空格,再替换为空格为 0
。
int n = 7;
String binaryString = String.format("%8s", Integer.toBinaryString(n)).replace(" ", "0");
assertEquals("00000111", binaryString);
📌 原理:%8s
表示输出至少占 8 个字符宽度,不足则左补空格。
✅ 方案二:Apache Commons Lang3 的 StringUtils.leftPad
如果你的项目引入了 commons-lang3
,可以直接使用 leftPad
。
int n = 7;
String binaryString = StringUtils.leftPad(Integer.toBinaryString(n), 8, '0');
assertEquals("00000111", binaryString);
⚠️ 注意:传入的是字符 '0'
,不是字符串 "0"
(重载方法存在,但建议统一用 char)。
✅ 自定义工具方法(推荐封装)
public static String toPaddedBinary(int n, int width) {
return String.format("%" + width + "s", Integer.toBinaryString(n)).replace(' ', '0');
}
使用示例:
toPaddedBinary(7, 8); // "00000111"
toPaddedBinary(1, 4); // "0001"
6. 总结
方法 | 优点 | 缺点 | 推荐场景 |
---|---|---|---|
手动实现 | 理解原理 | 冗余,易出错 | 学习/面试 |
Integer.toBinaryString() |
简洁,标准 API | 不支持补零 | 日常开发 |
Integer.toString(i, 2) |
通用性强,支持多进制 | 同上 | 多进制转换场景 |
String.format + replace |
无需依赖,灵活 | 稍显啰嗦 | 无外部依赖项目 |
StringUtils.leftPad() |
语义清晰,代码简洁 | 需引入 commons-lang3 | 已使用该库的项目 |
✅ 最佳实践建议:
- 日常开发首选
Integer.toBinaryString()
+String.format
补零 - 若项目已用
commons-lang3
,可直接用leftPad
- 面试时能手写算法加分
所有示例代码已托管至 GitHub:https://github.com/baeldung/java-tutorials(路径:core-java-modules/core-java-numbers-3)