上一篇
Java中二进制如何计算?
- 后端开发
- 2025-06-09
- 4852
在Java中,二进制数以
0b
或
0B
前缀表示(如
0b1010
),可通过
Integer.toBinaryString()
将整数转为二进制字符串,或使用位运算符(
&
、
|
、
^
、“)直接操作二进制位。
在Java中处理二进制数据是编程的基础技能,尤其涉及底层运算、位操作或性能优化时,下面从表示、计算、转换到应用全方位解析二进制操作:
Java中的二进制表示
-
二进制字面量(Java 7+)
前缀0b
或0B
表示二进制数,直接计算值:int num1 = 0b1010; // 10 (十进制) int num2 = 0B1100_1100; // 204 (十进制,下划线提高可读性)
-
位与字节的关系
- 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
实际应用场景
-
权限控制(位标志)
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
-
数据压缩存储
用1个int
存储多个布尔值:int flags = 0; flags |= 0b0001; // 设置第1位为true flags |= 0b1000; // 设置第4位为true
-
高性能计算
位运算比算术运算更快:// 判断奇偶性 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)
关键注意事项
-
位数限制
Integer.toBinaryString()
会省略前导零,需补零显示完整32位:String fullBits = String.format("%32s", binStr).replace(' ', '0');
- 负数按补码表示:
Integer.toBinaryString(-5)
→"11111111111111111111111111111011"
-
类型范围
byte
(8位):-128 ~ 127int
(32位):-2³¹ ~ 2³¹-1- 移位超出位数时使用
x & 0x1F
取模(int实际位移数 =x % 32
)
-
位运算优先级
位运算符优先级低于算术运算符,建议用括号: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”中强调位运算的精确性优势