
用 Integer.toBinaryString() 和 Integer.toHexString() 最快
Java 标准库已经提供了直接转字符串的静态方法,不需要手写除基取余。这两个函数接受 int(或自动装箱的 Integer),返回不含前缀的纯数字字符串。
常见错误是误以为它们会补零或带 0b/0x 前缀——实际不会。比如 Integer.toBinaryString(5) 返回 "101",不是 "0b101";Integer.toHexString(255) 返回 "ff",小写,也不带前缀。
- 如果需要固定位宽(如 8 位二进制),得自己用
String.format("%8s", ...).replace(' ', '0')或String.format("%08d", ...)配合转换结果 - 负数会按补码形式输出完整位数(如
Integer.toBinaryString(-1)返回 32 个1),这点容易被忽略 - 只支持
int;long得换用Long.toBinaryString()等对应方法
从字符串反向解析要用 Integer.parseInt(str, radix)
把二进制或十六进制字符串转回数值,核心是 Integer.parseInt() 的第二个参数:进制基数。它不认前缀,所以 "1010" 和 "0b1010" 是两回事——后者会抛 NumberFormatException。
常见错误是传错基数或忽略大小写:parseInt("FF", 16) 成功,但 parseInt("ff", 16) 也成功(默认不区分大小写);而 parseInt("1010", 2) 可以,parseInt("0b1010", 2) 就不行。
立即学习“Java免费学习笔记(深入)”;
- 基数只能是 2–36 之间的整数,超出直接抛异常
- 字符串里不能含空格、换行、前缀,连下划线都不行(Java 7+ 数字字面量支持下划线,但
parseInt不支持) - 溢出时抛
NumberFormatException,不是ArithmeticException,捕获时别搞错类型
需要前缀或大小写控制?用 String.format() 更可控
当要生成带 0x、0b 前缀,或强制大写十六进制时,String.format() 比拼接更可靠。
例如:String.format("0x%04X", 255) 得到 "0x00FF";String.format("0b%8s", Integer.toBinaryString(5)).replace(' ', '0') 得到 "0b00000101"。注意 %X 是大写,%x 是小写;%04x 表示至少 4 位、不足左补 0。
-
String.format()对负数默认输出带符号的十进制,不适用于进制格式化负数——此时仍得靠toBinaryString()等原生方法 - 性能上比直接调用
toHexString()多一次格式化开销,高频场景留意 - Android API 26+ 才支持
%b格式符输出二进制,旧版本必须组合使用
大数或非 int 范围?绕不开 BigInteger
一旦数值超出 int 或 long 范围(比如处理哈希值、密钥片段、超长二进制位串),Integer/Long 系列方法就失效了,必须上 BigInteger。
它的构造器支持带进制的字符串:new BigInteger("101010", 2);实例方法 toString(int radix) 支持任意进制(2–36),且对负数也按数学意义处理(不是补码)。
-
BigInteger.toString(2)输出不带符号位的纯二进制,负数会在前面加"-",和Integer.toBinaryString()行为完全不同 - 没有内置的前缀支持,要加
0x得自己拼接 - 创建对象有开销,短生命周期的小数值别滥用










