简介
位运算符用来对二进制位进行操作,一般来说位运算要比乘除算法快很多,在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次方。
公式:
- (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位置为1 | n或1<<x |
参考文献:
转载自阿里技术文章-Java位运算小节