位操作符都有哪些具体的应用呢,对于和我一样陷于业务逻辑中的程序猿来讲,它们就像一些熟悉的陌生人。今天在这里列举一些典型的例子,也希望以后能够进行补充。

“与” “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。