数值类型乘除的优化位运算原理

我们知道数值类型的位运算要远比乘除运算要快的多,这是因为位运算只需要移动几下位模式就行,时间消耗非常小,而乘除运算就得运算乘数次的加法运算;比如:

256<<2    这是将256的二进制向左移动了2位,相当于256*4
256*4     256直接乘以4(2^2),相当于256+256+256+256

两者的结果是一样的,再运算量很小时,可能看不出时间损耗差异,但当运算量特别大时,时间损耗的优虐就会显现出来(运算量越大,位运算就越能体现优势).下面我们看一段代码来看看:

 public static void main(String[] args){
        System.out.println("乘法运算:"+256*4);
        System.out.println("位运算:"+(256<<2));
        long time1=System.currentTimeMillis();
        for(int i=0;i<10000000;i++){
            int a=0;
            a=256*4;
        }
        System.out.println("乘法运算消耗时间:"+(System.currentTimeMillis()-time1));
        long time2=System.currentTimeMillis();
        for(int i=0;i<10000000;i++){
            int a=0;
            a=256<<2;
        }
        System.out.println("位运算消耗时间:"+(System.currentTimeMillis()-time2));
    }

我们来看一下运行结果:
在这里插入图片描述
从结果我们可看出乘法运算的时间损耗是位运算的2倍多,这还是乘数4很小的情况,当乘数越大时,这种差异就会越明显。
    所幸,现在Java设计者认识到了这个问题,所以对java乘除做了一些优化:将乘除法转化为位运算,所以当你发现位运算时间和乘除法运算时间相差不多的时候,不要慌,这是因为你的Java版本已经添加了对乘除法的优化。这时有的小伙伴可能就要问了,居然优化了。那么位运算和乘除运算的时间消耗也应该相同了,那为什么位运算还是比乘除运算快那么一丢丢呢?这是因为乘除运算后台虽然是位运算,但我们忽略了乘除运算中将乘数/除数的转为成二进制时消耗的时间。比如:

对256*312进行运算时,
1.优化的Java会先将312变成256+32+16+8(即2^8+2^5+2^4+2^3)
2.然后才进行位运算256<<8+256<<5+256<<4+256<<3

所以优化之后的乘除法运算只是比位运算多了第一步消耗的时间,而这部分时间对于一个很大运算量的运算来说是微不足道的,甚至可以忽略不记。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值