1. 概述
二进制使用 0 和 1 表示数字,是计算机存储和处理数据的基础。作为 Java 开发者,掌握二进制与十进制之间的转换,以及对二进制进行加减运算,是非常实用的基础技能。
本文将讲解以下内容:
✅ Java 中的二进制字面量
✅ 十进制转二进制与二进制转十进制
✅ 二进制加法与减法的实现方式
2. 二进制字面量
从 Java 7 开始,支持直接使用二进制字面量,只需在数字前加 0b
或 0B
前缀即可。这种方式在处理底层操作、位运算等场景时非常方便。
示例代码如下:
@Test
public void given_binaryLiteral_thenReturnDecimalValue() {
byte five = 0b101;
assertEquals((byte) 5, five);
short three = 0b11;
assertEquals((short) 3, three);
int nine = 0B1001;
assertEquals(9, nine);
long twentyNine = 0B11101;
assertEquals(29, twentyNine);
int minusThirtySeven = -0B100101;
assertEquals(-37, minusThirtySeven);
}
3. 二进制转换
3.1 十进制转二进制
Java 提供了内置方法 Integer.toBinaryString()
,可以直接将整数转为二进制字符串:
@Test
public void given_decimalNumber_then_convertToBinaryNumber() {
assertEquals("1000", Integer.toBinaryString(8));
assertEquals("10100", Integer.toBinaryString(20));
}
如果想自己实现转换逻辑,可以参考如下算法:
- 用 2 除以当前数,记录商和余数
- 继续用商除以 2,直到商为 0
- 将余数倒序拼接,即为二进制结果
代码实现如下:
public Integer convertDecimalToBinary(Integer decimalNumber) {
if (decimalNumber == 0) {
return decimalNumber;
}
StringBuilder binaryNumber = new StringBuilder();
Integer quotient = decimalNumber;
while (quotient > 0) {
int remainder = quotient % 2;
binaryNumber.append(remainder);
quotient /= 2;
}
binaryNumber = binaryNumber.reverse();
return Integer.valueOf(binaryNumber.toString());
}
3.2 二进制转十进制
Java 中可以使用 Integer.parseInt()
方法进行二进制字符串解析,只需指定基数为 2:
@Test
public void given_binaryNumber_then_ConvertToDecimalNumber() {
assertEquals(8, Integer.parseInt("1000", 2));
assertEquals(20, Integer.parseInt("10100", 2));
}
自定义实现思路如下:
- 从右往左遍历每一位
- 每一位乘以 2 的位数次方(从 0 开始)
- 将所有结果相加得到十进制值
示例代码如下:
public Integer convertBinaryToDecimal(Integer binaryNumber) {
Integer decimalNumber = 0;
Integer base = 1;
while (binaryNumber > 0) {
int lastDigit = binaryNumber % 10;
binaryNumber = binaryNumber / 10;
decimalNumber += lastDigit * base;
base = base * 2;
}
return decimalNumber;
}
4. 二进制运算
4.1 加法运算
二进制加法遵循以下规则:
- 0 + 0 = 0
- 0 + 1 = 1
- 1 + 1 = 10(即进位)
- 1 + 1 + 进位 = 11(即进位)
实现代码如下:
public Integer addBinaryNumber(Integer firstNum, Integer secondNum) {
StringBuilder output = new StringBuilder();
int carry = 0;
int temp;
while (firstNum != 0 || secondNum != 0) {
temp = (firstNum % 10 + secondNum % 10 + carry) % 2;
output.append(temp);
carry = (firstNum % 10 + secondNum % 10 + carry) / 2;
firstNum = firstNum / 10;
secondNum = secondNum / 10;
}
if (carry != 0) {
output.append(carry);
}
return Integer.valueOf(output.reverse().toString());
}
4.2 减法运算
二进制减法可以使用“一补数”(One's Complement)方法实现。步骤如下:
- 求出被减数的一补数(即每位取反)
- 将一补数与被减数相加
- 如果有进位,加到结果上
- 如果没有进位,结果为负数,取一补数作为最终结果
一补数函数实现如下:
public Integer getOnesComplement(Integer num) {
StringBuilder onesComplement = new StringBuilder();
while (num > 0) {
int lastDigit = num % 10;
if (lastDigit == 0) {
onesComplement.append(1);
} else {
onesComplement.append(0);
}
num = num / 10;
}
return Integer.valueOf(onesComplement.reverse().toString());
}
减法函数实现如下:
public Integer substractBinaryNumber(Integer firstNum, Integer secondNum) {
int onesComplement = Integer.valueOf(getOnesComplement(secondNum));
StringBuilder output = new StringBuilder();
int carry = 0;
int temp;
while (firstNum != 0 || onesComplement != 0) {
temp = (firstNum % 10 + onesComplement % 10 + carry) % 2;
output.append(temp);
carry = (firstNum % 10 + onesComplement % 10 + carry) / 2;
firstNum = firstNum / 10;
onesComplement = onesComplement / 10;
}
String additionOfFirstNumAndOnesComplement = output.reverse().toString();
if (carry == 1) {
return addBinaryNumber(Integer.valueOf(additionOfFirstNumAndOnesComplement), carry);
} else {
return getOnesComplement(Integer.valueOf(additionOfFirstNumAndOnesComplement));
}
}
5. 总结
本文介绍了 Java 中如何处理二进制数:
✅ 使用二进制字面量简化编码
✅ 使用内置方法和自定义逻辑实现二进制与十进制之间的转换
✅ 实现了二进制加法和减法的底层逻辑
这些知识对于理解底层运算、位运算、网络协议、加密算法等场景非常有用。
完整代码示例可在 GitHub 上找到。