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

位运算符中,<<和>>运算符将位模式左移或者右移,使用这种运算符有些时候会进行非常快速的运算。<<表示左移乘2,>>表示右移除2

  • int a = 256 * 100;那么a就为100个256相加。
  • 对于位运算原理来说,100 = 64 + 32 + 4 = 2^6 + 2^5 +2^2
    a = 256 * ( 2^6 + 2^5 +2^2)= 256 * 2^6 + 256 * 2^5 + 256 * 2^2
    = (256<<6) + (256<<5) + (256<<2)
    <<运算符后面跟的是2的多少次幂

光说可能没有特别的感官,我们用代码来测试一下。

public class Test {

 	public static void test1(){
       double start  = System.currentTimeMillis();
       int a = 0;
       for(int i = 0;i<50000;i++) {
           a += 256 * 100;
       }
       System.out.println(a);
       double end = System.currentTimeMillis();
       System.out.println("运行时间: " + (end - start));
   }

   public static void test2(){
       double start  = System.currentTimeMillis();
       int b = 0;
       for(int i = 0;i<50000;i++) {
           b += (256 << 6) + (256 << 5) + (256 << 2);
       }
       System.out.println(b);
       double end = System.currentTimeMillis();
       System.out.println("运行时间: " + (end - start));
   }



   public static void main(String[] args) {
       // TODO Auto-generated method stub
       test1();
       test2();
   }

}

我们可以得到如下的结果:
在这里插入图片描述


总结:
实际在我们程序进行计算时,如果只执行一次计算,乘法和位运算符运算时间都是毫秒级别的,两者相差不大,时间有一部分是消耗在输出语句等。在进行极多次计算时,java对程序计算进行了优化,两数相乘和位运算符的计算时间相差不大,但实际上相乘是需要很长时间的,也从结果可以看出,增加了循环次数,位运算符计算所需要的时间比乘法的时间短。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值