十进制与二进制的相互转换
十进制与二进制的相互转换
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)
- 理解算法:手动循环按权相加
力扣真题

解法一:
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)。
浙公网安备 33010602011771号