Java位运算技巧

简介

位运算符用来对二进制位进行操作,一般来说位运算要比乘除算法快很多,在java中除~以外其他的都是二元运算符。

位运算符号

  • & 按位与,1000 & 0001 = 0000
  • | 按位或,1000 | 0001 = 1001
  • ^ 按位异或,1000 ^ 0001 = 1001
  • ~ 取反,~1000 = 0111
  • << 左移,1000 << 1 = 10000
  • ‘>>’ 右移,11111111111111111111111111111000 >> 1 = 11111111111111111111111111111100
  • ‘>>>’ 无符号右移,11111111111111111111111111111000 >>> 1 = 01111111111111111111111111111100

注意:

这里>>>与>>的区别在于>>>是不会保留符号位的,>>>会将最高位进行填零补充,而>>则会带上符号位进行右移。

位运算优先级

~运算优先级最高,其次是<< >> >>>,再次是& ,然后是^ ,最后是 |

位运算应用

1.如何判断一个数是否是偶数?
公式:

  • x&1=0偶数
  • x&1=1奇数

2.如何利于位运算计算某变量除以2^n值。
公式:

  • x/2^n == x>>n

3.如何判断一个大于零的整数是2的n次方。
公式:

  1. (n&(n-1)==0) && (n>0)

原理:因为2的n次方整数二进制位有一个特点,就是无论n是几,其位图一定为10000…(n-1个零),那么n-1过后的位图就一定为011111…(n-1个1),所以(n&(n-1)==0) && (n>0)==true 即n为2的n次方。

4.取模运算,利用位运算符如何得出m%n的值,且n必须是2的x次方。
公式:

  • m%n=m&(n-1)

原理:这里前提条件是n必须是2的x次方,那么为什么必须是x的次方才能这么操作呢?答案我们利用公式转换一下就可以知道答案,m%n就是求m除以n的余数,m/n等于m/2^x,也就等于m>>x,这里我们假定m是9、x为2也就是9>>2。位图表示就是1001>>2等于10,那么01是被移掉的两位,所以9%4的余数也就是这两位,那么怎么得到被移掉的两位呢,9&4-1=1001&0011=0001,所以9%4=9&3=1。

5.如何计算n*2^x的结果
公式:

  • n*2^x=n<<x

6.如何利用位移交换两个数。
公式:

  • x^=y
  • y^=x
  • x^=y

7.将数字n的第x位清零。
公式:

  • n&~1<<x

原理:~1<<x,假如x等于2,则1<<2等于4,位图为100,取反得11111111111111111111111111111011,所以n&11111111111111111111111111111011就将第2位清零了。

8.将数字n的第x位置为1。
公式:

  • n|1<<x

原理:同第七条。

总结

功能位运算
判断一个数是否是偶数x&1=0
判断一个数是否是奇数x&1=1
算某变量除以2^n的值x>>n
算某变量的2^n倍x<<n
判断一个大于零的整数是2的n次方(n&(n-1)==0) && (n>0)
m%n的值,且n必须是2的x次方m%n=m&(n-1)
如何利用位移交换两个数x^=y 、y^=x 、x^=y
将数字n的第x位清零n&~1<<x
将数字n的第x位置为1n或1<<x

参考文献:
转载自阿里技术文章-Java位运算小节

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值