位运算符可以分为逻辑运算符(包括~、&、|和^)及移位运算符(包括>>、<<和>>>)。
逻辑运算符(包括~、&、|和^)
略。
移位运算符(包括>>、<<和>>>)
略。
位运算的妙用
计算n=2k,n=2k+1这种关系
System.out.println(8 >> 1); //4
System.out.println(9 >> 1); //4
System.out.println(10 >> 1); //5
System.out.println(11 >> 1); //5
可以看到,使用移位运算可以轻松计算出n=2k,n=2k+1这种关系。 参考自java.util.PriorityQueue中使用堆排序的计算方法。
求余的优化
因为求余运算要用到除法,除法是比较费时的。因此高性能的程序需要对求余进行转换。 如果被求余数是2的整数次幂,可以用位运算来进行转换,从而得到比较高的效率。
System.out.println(6%4); //2
System.out.println(6&(4-1)); //2
参考自java.util.HashMap的indexFor方法。
乘除2使用位运算
System.out.println(3 * 2); //6
System.out.println(3 << 1); //6
System.out.println(4 / 2); //2
System.out.println(4 >> 1); //2
参考:HashMap源码中对数组的扩容使用的是移位运算;
int newCapacity = table.length;
while (newCapacity < targetCapacity)
newCapacity <<= 1;
if (newCapacity > table.length)
resize(newCapacity);
总结
在性能要求比较高的程序中,使用位运算可以提高计算效率。(普通的+,-,*,/,%
等运算jvm需要将其进行转码,进移位等一些操作,在代码中直接进行位运算就可以省掉cpu额外的运算)
哪些计算可以使用位运算去简化? 跟2的倍数或者乘方相关的运算可以考虑使用位运算(因为计算机使用的是二进制嘛)。 具体后面碰到了再继续总结。