取模和按位与的关系
求余数时,经常会用到取模操作,当除数b=2n时,可以满足使用按位与代替,直接对内存中的二进制位进行操作更加高效;(n∈N)
a % b = a & (b-1)(b=2n)
即:a % 2n = a & (2n-1)
例如:11 % 4 = 11 & 3 = 3
0100-1(4) ——> 0011(3)
原理
1 0 1 1 =11
& 0 0 1 1 =3
————————————————————————
0 0 1 1 =3
2n(22=0100)保证了最高位为1,2n-1(22-1=0011)消除了最高位,其他位变为1,按位与运算后被除数与之对应的位便会被保留下来;
保留下来的位,取值范围在[0,2n-1],即为原算式(11%4=3)取模得到的余数;
案例
奇数偶校验:
/**
* 验证奇数(true),偶数(false)
*/
public static boolean isOdd(int num) {
// return (num % 2) == 1;
return (num & 1) == 1;
}
闰年校验:
/**
* 验证闰年(true),平年(false)
*/
public static boolean isLeapYear(int year) {
// return ((year % 4) == 0) && ((year % 100) != 0 || (year % 400) == 0);
return ((year & 3) == 0) && ((year % 100) != 0 || (year % 400) == 0);
}