位操作符都有哪些具体的应用呢,对于和我一样陷于业务逻辑中的程序猿来讲,它们就像一些熟悉的陌生人。今天在这里列举一些典型的例子,也希望以后能够进行补充。
“与” “AND” “&”
对2n取模,HashMap读取元素的时候通过此方法获取底层数组的index。
HashMap的size始终为2n,而h%2n等于h&(2n-1)。
/** * Returns index for hash code h. */static int indexFor(int h, int length) { return h & (length-1);}
判断一个Integer是否为2的整数次幂。
boolean power2(int x){ return ((x&(x-1))==0)&&(x>0);}
“异或” “XOR” “^”
不用临时变量交换两个Integer,因为异或运算的逆运算是其自身。
void swap(int a , int b){ a ^= b; b ^= a; a ^= b;}
“左、右移位” “<<, >>”
一些运算
2n equals 1 << n
a << n 等价于 a * 2n
a >> n 等价于 a / 2n
注:对于“<<”,如果没有溢出,无论正数还是负数,左移n位都相当于a * 2n.
对于“>>”,如果结果是正的小数,无条件舍弃小数位;如果是负的小数,舍弃小数位并给整数位+1。