Java求余运算

Java求余运算

求余结果不一定能为整数。求余运算的真正过程为使用第一操作数除以第二个操作数,得到一个整数的结果后剩下的值就是余数。求余运算是两部操作,先除后减。举个例子:

public class Main
{
    public static void main(String[] args)
    {
        double a = 5.2;
        double b = 3.1;
        double ret = a % b;
        System.out.println(ret); // output: 2.1 
    }
}

因为 5.2 = 3.1 * 1 + 2.1;

在刷OJ时,有时需要注意这个%,因为是两步的操作,如果时间卡的特别死而且数据十分的强的话一定要注意%的时间开销。

更加快速的取mod运算方法 —— 位与操作

笔者是通过阅读HashMap的底层实现源码学习到这种方法。HashMap确定entry在table数组的位置的方法就是把Key.hashCode()作为参数,重新利用自己的算法计算一遍hashCode,并将此hashCode同table.length-1进行%运算,通过余数确定entry的位置。巧就巧在利用了&运算。代码如下

static int indexFor(int h, int length) {  
       return h & (length-1);  
   }  

HashMap的size恒为2的次方大小。这里的h是HashMap自己算的hashcode。length传入table.length-1。由于table数组的length为2^n,通过几个样例计算发现此时做&运算时的效果正好等同于%,位运算的速度是很快的。所以,下次如果说需要取模而且数组长度为2^n时,可以首先考虑&运算。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值