关于mod的另一种高效写法
平时做mod运算时,一般习惯于以下的写法:
1 | int a = b % c; |
在很多的类库中都是类似这样的写法:
1 | int a = b & 0xfffL; |
第一种是正常的数学写法,第二种使用的是位运算。
位运算模式:
比如: 10 % 4 = 2
1 | 10 % 4 = 2; |
看到位运算为什么是4-1=3呢?
1 | 10 = 0b1010; |
使用&的是Java可表达的数字即可,多种进制均可使用:
- 0xfL =15 16进制
- 077 = 15 8进制
- 0b1111 = 15 2进制
- 15 10进制
性能
用JMH进行测试:
循环100次,mod32的结果
循环1000次,mod32的结果
循环10000次,mod32的结果
循环1000000次,mod32的结果
循环Intger.MAX_VALUE次,mod32的结果
结论
使用位运算,性能看起来没啥差别,按需选择就行了。
JVM是怎么实现%的呢?