方法定义
Long.toBinaryString()
是 java.lang.Long
类提供的静态方法,用于将 long
类型的值转换为其对应的无符号二进制字符串表示。
方法签名
public static String toBinaryString(long i)
- 参数:
i
- 要转换的long
值 - 返回值:表示该
long
值的二进制字符串(无符号形式) - 异常:无
功能说明
- 将一个
long
整数转换为以 2 为基数 的二进制字符串。 - 对于负数,采用 补码(two's complement) 形式表示,并且不包含符号位,即返回的是无符号二进制字符串。
- 生成的字符串仅包含字符
'0'
和'1'
。 - 不包含前导
0b
标识(如 Python 中的0b1010
),也不自动补零。
示例代码
1. 基本使用(正数)
long num = 10;
String binary = Long.toBinaryString(num);
System.out.println(binary); // 输出: 1010
// 验证
System.out.println(Long.toBinaryString(0)); // 0
System.out.println(Long.toBinaryString(1)); // 1
System.out.println(Long.toBinaryString(15)); // 1111
System.out.println(Long.toBinaryString(255)); // 11111111
2. 负数处理(关键特性)
long negative = -1;
String bin = Long.toBinaryString(negative);
System.out.println(bin);
// 输出: 1111111111111111111111111111111111111111111111111111111111111111
// 共 64 个 '1',因为 -1 的补码是全 1
🔍 原理:Java 使用 64 位补码表示
long
。-1
的二进制补码是 64 个1
。
3. 零值
System.out.println(Long.toBinaryString(0L)); // 输出: 0
使用技巧
✅ 技巧1:补前导零(格式化为固定长度)
Java 默认不补零,若需 64 位完整表示:
long value = 10;
String binary = Long.toBinaryString(value);
// 补足 64 位
String padded = String.format("%64s", binary).replace(' ', '0');
System.out.println(padded);
// 输出: 0000000000000000000000000000000000000000000000000000000000001010
✅ 技巧2:添加 0b
前缀(更清晰)
long value = 10;
String binary = "0b" + Long.toBinaryString(value);
System.out.println(binary); // 输出: 0b1010
✅ 技巧3:分组显示(每 4 位或 8 位分隔)
public static String formatBinary(String bin) {
StringBuilder sb = new StringBuilder(bin);
// 从右往左每 4 位插入空格
for (int i = sb.length() - 4; i > 0; i -= 4) {
sb.insert(i, " ");
}
return sb.toString();
}
System.out.println(formatBinary(Long.toBinaryString(255)));
// 输出: 1111 1111
常见错误
❌ 错误1:误以为负数会带负号
// 错误预期
// System.out.println(Long.toBinaryString(-1)); // 期望 "-1" ❌
// 实际输出(无符号补码)
System.out.println(Long.toBinaryString(-1));
// 输出: 1111111111111111111111111111111111111111111111111111111111111111
✅ 正确理解:返回的是无符号二进制表示,负数以补码形式输出。
❌ 错误2:混淆 toBinaryString()
与 toString(i, 2)
// 功能相同,但 toBinaryString 更高效、语义更清晰
Long.toString(-1, 2); // 同样输出 64 个 1
Long.toBinaryString(-1); // 推荐写法
❌ 错误3:误用实例方法
Long value = 100L;
// value.toBinaryString(); // 编译错误!这是静态方法
String bin = Long.toBinaryString(value); // 正确
注意事项
- 无符号输出:即使输入是负数,返回的字符串也不带
-
符号。 - 补码表示:负数以 64 位补码形式输出,结果是 64 位长的二进制串。
- 无前导零:小数值不会自动补零到 64 位。
- 线程安全:静态方法,无状态,线程安全。
- 性能优秀:JVM 内部优化,比
toString(i, 2)
更快。
最佳实践与性能优化
场景 | 推荐做法 |
---|---|
一般二进制转换 | Long.toBinaryString(value) |
需要固定长度 | 配合 String.format 补零 |
需要可读性 | 添加空格分隔或 0b 前缀 |
性能敏感场景 | 避免频繁调用,缓存结果 |
与其它进制对比 | 优先使用专用方法:toOctalString() , toHexString() |
🔧 性能建议
- 该方法性能良好,内部使用位运算优化。
- 在循环中频繁调用时,考虑是否可缓存结果。
- 若需拼接字符串,使用
StringBuilder
:
StringBuilder sb = new StringBuilder();
sb.append("Binary: ").append(Long.toBinaryString(value));
与其他方法对比
方法 | 说明 | 适用场景 |
---|---|---|
Long.toBinaryString(i) |
专用二进制转换,高效 | 推荐用于二进制输出 |
Long.toString(i, 2) |
通用进制转换(radix=2) | 通用场景,但稍慢 |
Integer.toBinaryString() |
仅用于 int 类型 |
32 位整数处理 |
总结
项目 | 说明 |
---|---|
核心功能 | 将 long 值转换为无符号二进制字符串(补码表示) |
关键特性 | 负数以 64 位补码输出,不带负号 |
优点 | 语义清晰、性能高、专为二进制设计 |
缺点 | 不自动补零、不带前缀、不支持格式化 |
替代方案 | toString(i, 2) (通用)、String.format("%x") (十六进制) |
性能 | ⭐⭐⭐⭐⭐ 高效,推荐优先使用 |
💡 一句话掌握:
Long.toBinaryString(long i)
是将long
转为二进制字符串的首选方法,
特别注意:负数返回的是补码形式的无符号字符串,
如需格式化(补零、分隔),需额外处理。