• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • YouClaw
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

youyou-dev

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

十进制与二进制的相互转换

十进制与二进制的相互转换

1、十进制转二进制

1、使用 Integer.toBinaryString()

这是最简单直接的方法,返回无符号整数的二进制字符串表示。

int decimal = 42;
String binary = Integer.toBinaryString(decimal);
System.out.println(binary); // 输出: 101010

2、Integer.toString(int, radix)

radix 参数指定进制,2 表示二进制。

int decimal = 42;
String binary = Integer.toString(decimal, 2);
System.out.println(binary); // 输出: 101010

3、手动实现“除 2 取余”算法

适合理解转换原理,循环除 2 并收集余数。

public static String decimalToBinary(int n) {
    if (n == 0) return "0";
    StringBuilder sb = new StringBuilder();
    while (n > 0) {
        sb.append(n % 2);   // 取余数
        n /= 2;             // 除以 2
    }
    return sb.reverse().toString(); // 反转得到正确顺序
}

4、 使用位运算(位移)

适用于整数,利用 >>和&逐位获取。

public static String decimalToBinary(int n) {
    StringBuilder sb = new StringBuilder();
    for (int i = 31; i >= 0; i--) {
        sb.append((n >> i) & 1);
    }
    // 去除前导零(保留至少一位)
    String binary = sb.toString().replaceFirst("^0+(?!$)", "");
    return binary.isEmpty() ? "0" : binary;
}

2、二进制转十进制

1. 使用 Integer.parseInt(String, radix)
最简洁的方法,指定 radix 为 2 即可将二进制字符串转换为整数。
String binary = "101010";
int decimal = Integer.parseInt(binary, 2);
System.out.println(decimal); // 输出: 42
  • 如果字符串以 0 或 1 开头,可以正常解析。

  • 如果包含非二进制字符,会抛出 NumberFormatException。

2. 使用 Integer.valueOf(String, radix)

与 parseInt 类似,但返回 Integer 对象(自动拆箱也可用)。

String binary = "101010";
int decimal = Integer.valueOf(binary, 2);
System.out.println(decimal); // 输出: 42
3. 使用 BigInteger 处理大二进制数

如果二进制字符串很长(超过 32 位或 64 位),可以用 BigInteger。

import java.math.BigInteger;

String binary = "1111111111111111111111111111111111111111";
BigInteger decimal = new BigInteger(binary, 2);
System.out.println(decimal);
4. 手动实现按权相加(理解原理)

二进制转十进制公式: decimal = ∑ (bit × 2^(位权)),从最低位(最右边)开始位权为 0。

public static int binaryToDecimal(String binary) {
    int decimal = 0;
    int power = 0;
    for (int i = binary.length() - 1; i >= 0; i--) {
        char bit = binary.charAt(i);
        if (bit == '1') {
            decimal += Math.pow(2, power);
        }
        power++;
    }
    return decimal;
}

或者使用左移方式优化(避免 Math.pow):

public static int binaryToDecimal(String binary) {
    int decimal = 0;
    for (int i = 0; i < binary.length(); i++) {
        decimal = (decimal << 1) + (binary.charAt(i) - '0');
    }
    return decimal;
}
5. 处理负数

二进制字符串如果表示负数(如补码形式),Integer.parseInt 无法直接识别,因为默认认为无符号。若要解析有符号二进制,可以使用 Integer.parseUnsignedInt 配合进制,然后强制转为 int(适用于 32 位)。

String binary = "11111111111111111111111111111111";
int decimal = Integer.parseUnsignedInt(binary, 2);
System.out.println(decimal); // 输出 -1

注意事项

  • parseInt 和 valueOf 只能处理不超过 32 位的二进制数(即最多 32 个字符,不含符号)。

  • 二进制字符串可以包含前导零,不影响结果。

  • 如果字符串长度超过 32 位,请使用 BigInteger。

总结

  • 简单场景:Integer.parseInt(binary, 2)

  • 大数:new BigInteger(binary, 2)

  • 理解算法:手动循环按权相加
力扣真题

image

解法一:

class Solution {
    public int bitwiseComplement(int n) {
        String s = Integer.toString(n, 2);
        s = s.replace('0', '2')   // 先将0替换为临时字符
             .replace('1', '0')
             .replace('2', '1');
        return Integer.parseInt(s, 2);   
    }
}

解法二:

class Solution {
    public int bitwiseComplement(int n) {
        String binary = Integer.toBinaryString(n);
        StringBuilder sb = new StringBuilder();
        for (char c : binary.toCharArray()) {
            sb.append(c == '0' ? '1' : '0');
        }
        return Integer.parseInt(sb.toString(), 2);
    }
}

解法三:(最优解)
核心思路

  • 找到一个二进制位数与 n 相同且所有位都是 1 的掩码 mask(例如 n = 5 二进制 101,则 mask = 111)。

  • 对 n 按位取反,即 n ^ mask(异或)。

  • 特殊处理 n = 0,因为 0 的二进制是 "0",反码应为 "1",对应十进制 1

class Solution {
    public int bitwiseComplement(int n) {
        if (n == 0) return 1;
        int mask = (Integer.highestOneBit(n) << 1) - 1;
        return n ^ mask;
    }
}

解释:

Integer.highestOneBit(n) 返回只保留 n 的最高位 1 的整数(例如 5 → 4)。

左移一位得到更高一位的 1(4 << 1 = 8),再减 1 得到全 1 掩码(8-1=7,即 111)。

异或 n ^ mask 恰好将每个二进制位取反(11=0,01=1)。

posted on 2026-03-28 18:13  U~U  阅读(1)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3