1. 概述

二进制使用 0 和 1 表示数字,是计算机存储和处理数据的基础。作为 Java 开发者,掌握二进制与十进制之间的转换,以及对二进制进行加减运算,是非常实用的基础技能。

本文将讲解以下内容:

✅ Java 中的二进制字面量
✅ 十进制转二进制与二进制转十进制
✅ 二进制加法与减法的实现方式

2. 二进制字面量

从 Java 7 开始,支持直接使用二进制字面量,只需在数字前加 0b0B 前缀即可。这种方式在处理底层操作、位运算等场景时非常方便。

示例代码如下:

@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));
}

如果想自己实现转换逻辑,可以参考如下算法:

  1. 用 2 除以当前数,记录商和余数
  2. 继续用商除以 2,直到商为 0
  3. 将余数倒序拼接,即为二进制结果

代码实现如下:

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));
}

自定义实现思路如下:

  1. 从右往左遍历每一位
  2. 每一位乘以 2 的位数次方(从 0 开始)
  3. 将所有结果相加得到十进制值

示例代码如下:

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)方法实现。步骤如下:

  1. 求出被减数的一补数(即每位取反)
  2. 将一补数与被减数相加
  3. 如果有进位,加到结果上
  4. 如果没有进位,结果为负数,取一补数作为最终结果

一补数函数实现如下:

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 上找到。


原始标题:Binary Numbers in Java