当前位置:首页 > 后端开发 > 正文

Java中二进制如何计算?

在Java中,二进制数以 0b0B前缀表示(如 0b1010),可通过 Integer.toBinaryString()将整数转为二进制字符串,或使用位运算符( &|^、“)直接操作二进制位。

在Java中处理二进制数据是编程的基础技能,尤其涉及底层运算、位操作或性能优化时,下面从表示、计算、转换到应用全方位解析二进制操作:

Java中的二进制表示

  1. 二进制字面量(Java 7+)
    前缀 0b0B 表示二进制数,直接计算值:

    int num1 = 0b1010;     // 10 (十进制)
    int num2 = 0B1100_1100; // 204 (十进制,下划线提高可读性)
  2. 位与字节的关系

    Java中二进制如何计算?  第1张

    • 1位(bit) = 0或1
    • 8位 = 1字节(byte)
    • int类型占4字节(32位),long占8字节(64位)

二进制基础计算

▶ 算术运算(自动转为十进制)

int a = 0b1001;  // 9
int b = 0b0011;  // 3
System.out.println(a + b); // 输出12 (十进制)
System.out.println(a * b); // 输出27

▶ 位运算(直接操作二进制位)

运算符 名称 示例 结果(二进制)
& 位与 0b1100 & 0b1010 0b1000 (8)
| 位或 0b1100 | 0b1010 0b1110 (14)
^ 异或 0b1100 ^ 0b1010 0b0110 (6)
取反 ~0b1100 0b1111...0011(32位)
<< 左移 0b0001 << 3 0b1000 (8)
>> 符号右移 0b1000 >> 2 0b0010 (2)
>>> 无符号右移 0b1000_0000 >>> 4 0b0000_1000 (8)

进制转换核心方法

1️⃣ 十进制 → 二进制

int decimal = 15;
// 方法1:Integer.toBinaryString()
String binStr = Integer.toBinaryString(decimal); // "1111"
// 方法2:手动计算(除2取余法)
StringBuilder sb = new StringBuilder();
while (decimal > 0) {
    sb.insert(0, decimal % 2);  // 余数拼到左侧
    decimal /= 2;
}
// 结果:sb.toString() = "1111"

2️⃣ 二进制 → 十进制

// 方法1:二进制字面量
int num = 0b1110;  // 自动转十进制:14
// 方法2:Integer.parseInt()
String binaryStr = "1101";
int value = Integer.parseInt(binaryStr, 2); // 参数2表示进制,输出13

实际应用场景

  1. 权限控制(位标志)

    final int READ = 0b0001;  // 1
    final int WRITE = 0b0010; // 2
    final int EXECUTE = 0b0100; // 4
    int userPermission = READ | WRITE; // 0b0011 (3)
    boolean canWrite = (userPermission & WRITE) != 0; // true
  2. 数据压缩存储
    用1个int存储多个布尔值:

    int flags = 0;
    flags |= 0b0001; // 设置第1位为true
    flags |= 0b1000; // 设置第4位为true
  3. 高性能计算
    位运算比算术运算更快:

    // 判断奇偶性
    boolean isEven = (num & 1) == 0;  // 比 num % 2 == 0 更快
    // 乘以/除以2的幂
    int x = 8;
    int doubled = x << 1;  // 16 (等价于 x*2)
    int quarter = x >> 2;  // 2 (等价于 x/4)

关键注意事项

  1. 位数限制

    • Integer.toBinaryString() 会省略前导零,需补零显示完整32位:
      String fullBits = String.format("%32s", binStr).replace(' ', '0');
    • 负数按补码表示:Integer.toBinaryString(-5)"11111111111111111111111111111011"
  2. 类型范围

    • byte(8位):-128 ~ 127
    • int(32位):-2³¹ ~ 2³¹-1
    • 移位超出位数时使用 x & 0x1F 取模(int实际位移数 = x % 32
  3. 位运算优先级
    位运算符优先级低于算术运算符,建议用括号:

    int y = 5 + 3 << 2;   // 等价于 (5+3)<<2 = 32
    int z = 5 + (3 << 2); // = 17

完整示例演练

public class BinaryDemo {
    public static void main(String[] args) {
        // 1. 二进制计算
        int a = 0b1001; // 9
        int b = 0b0110; // 6
        System.out.println("a & b: " + Integer.toBinaryString(a & b)); // 0000
        // 2. 十进制转二进制
        int num = 25;
        String bin = Integer.toBinaryString(num);
        System.out.println("25的二进制: " + bin); // 11001
        // 3. 补零显示
        String padded = String.format("%8s", bin).replace(' ', '0');
        System.out.println("补零后: " + padded); // 00011001
    }
}

权威引用说明

  • Oracle官方Java文档:Primitive Data Types
  • Java语言规范:Bitwise Operators
  • 《Effective Java》第3版:第60条“若需精确答案,避免使用float和double”中强调位运算的精确性优势
0