Java位运算的妙用

位运算符可以分为逻辑运算符(包括~、&、|和^)及移位运算符(包括>>、<<和>>>)。

逻辑运算符(包括~、&、|和^)

略。

移位运算符(包括>>、<<和>>>)

略。

位运算的妙用

计算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的倍数或者乘方相关的运算可以考虑使用位运算(因为计算机使用的是二进制嘛)。 具体后面碰到了再继续总结。

转载于:https://my.oschina.net/grace233/blog/1920155

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值