关于mod的另一种高效写法

平时做mod运算时,一般习惯于以下的写法:

1
int a = b % c;

在很多的类库中都是类似这样的写法:

1
int a = b & 0xfffL;

第一种是正常的数学写法,第二种使用的是位运算。
位运算模式:
比如: 10 % 4 = 2

1
2
3
10 % 4 = 2;
// 转化为
10 & (4-1) = 2;

看到位运算为什么是4-1=3呢?

1
2
3
4
5
6
10 = 0b1010;
3 = 0b11;
// 计算过程:
1010
& 0011
= 0010 = 2;

使用&的是Java可表达的数字即可,多种进制均可使用:

  1. 0xfL =15 16进制
  2. 077 = 15 8进制
  3. 0b1111 = 15 2进制
  4. 15 10进制

性能

用JMH进行测试:
循环100次,mod32的结果

循环1000次,mod32的结果

循环10000次,mod32的结果

循环1000000次,mod32的结果

循环Intger.MAX_VALUE次,mod32的结果

结论

使用位运算,性能看起来没啥差别,按需选择就行了。

JVM是怎么实现%的呢?