一、判断奇偶数
//偶数
a & 1 = 0
//奇数
a & 1 = 1
我们可以利用 & 运算符的特性,来判断二进制数第一位是0还是1。
用if ((a & 1) == 0) 代替 if (a % 2 == 0)来判断a是不是偶数。
二、交换两个数
- 临时变量法:
int temp = a;
a = b;
b = temp;
- 使用 ^ 位运算符:
a ^= b;
b ^= a;
a ^= b;
需要了解一下 ^ 的几个特性:
a ^ a = 0
a ^ 0 = a
(a ^ b) ^ c = a ^ (b ^ c)
从数学角度来分析:
第一步:a = a ^ b
第二步:b = a ^ b = (a ^ b) ^ b = a ^ (b ^ b) = a ^ 0 = a
第三步:a = a ^ b = (a ^ b) ^ b = (a ^ a) ^ b = b ^ 0 = b
三、取余
其实取余算法和上面的判断奇偶数原理是一样的。
比如说我们要让a对16进行取余,那么就可以让 a & 15 得出来的结果就是余数。
可以看出15的二进制表示为:
0000 0000 0000 0000 0000 0000 0000 1111
所以 a & 15 返回值就是a二进制的最低四位,也就是
a & 15 = a % 16
使用 & 来进行取余的算法比使用 % 效率高很多,虽然只能对2^n的数值进行取余计算,但是在JDK源码中也是经常被使用到,比如说HashMap中判断key在Hash桶中的位置。