一、Java位运算基础概念
二进制底层逻辑
Java采用32位二进制补码存储整数,理解原码、反码、补码转换是掌握位运算的基础。如-5的补码表示为
11111111 11111111 11111111 11111011
12。
运算类型概览
运算符 功能说明 示例(a=60,b=13)
&
按位与 60&13=12(00111100 & 00001101)
` ` 按位或
^
异或 60^13=49(相同为0,相异为1)
~
取反 ~60=-61(补码取反)
<<
左移 3<<2=12(0011→1100)
>>
带符号右移 -8>>1=-4(符号位填充)
>>>
无符号右移 -8>>>1=214748364413
二、4大高频应用场景
权限控制系统
// 使用位掩码管理权限
final int READ = 1<<0; // 0001
final int WRITE = 1<<1; // 0010
int userPerm = READ | WRITE; // 0011
boolean canWrite = (userPerm & WRITE) != 0;
算法效率优化
快速判断奇偶:
(num & 1) == 0
交换变量值:
a ^= b; b ^= a; a ^= b;
计算绝对值:
(num ^ (num >> 31)) - (num >> 31)
11
数据压缩存储
使用1个int类型存储4个byte数据:
int packed = (b1<<24) | (b2<<16) | (b3<<8) | b4;
高性能计算
乘法替代:
a << n
等效于
a*2?
取模运算:
a & (b-1)
当b是2的幂时9
三、3个常见开发误区
位移越界问题
// 错误示例:int类型左移32位实际移动0位
int x = 5 << 32; // 结果为5
符号处理陷阱
右移运算符
>>
会保留符号位,而
>>>
用0填充高位:
-8 >> 1 = -4 // 11111111 11111111 11111111 11111100
-8 >>> 1 = 2147483644 // 01111111 11111111 11111111 11111100
运算符优先级混淆
位运算优先级低于比较运算符,必须使用括号:
if((value & MASK) != 0) {...}
优化建议:
结合JOL工具查看对象内存布局
在循环体等高频执行代码块中使用位运算
对超过100万次的操作进行基准测试(JMH工具)
通过掌握这些核心技巧,开发者可提升20%-300%的代码执行效率。更多位运算在加密算法、图像处理等领域的深度应用案例,可参考《Java性能权威指南》1 。