方法定义

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); // 正确

注意事项

  1. 无符号输出:即使输入是负数,返回的字符串也不带 - 符号。
  2. 补码表示:负数以 64 位补码形式输出,结果是 64 位长的二进制串。
  3. 无前导零:小数值不会自动补零到 64 位。
  4. 线程安全:静态方法,无状态,线程安全。
  5. 性能优秀: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 转为二进制字符串的首选方法
特别注意:负数返回的是补码形式的无符号字符串
如需格式化(补零、分隔),需额外处理。