java乘法_java 位移运算与乘法运算

对于

JAVA

编程中,适当的采用位移运算,会减少代码的运行时间,提高项目的运行效率。这个可以从一道面试题说起:

问题:

答案:2 << 3

由此就引发了我的思考,为什么位移运算会比乘法运算更快呢?其实简单的想想,计算机的内存是用由

0

1

组成的二进制数据形式来表示数据的,对于乘法运算,我想内部应该还会转化成位移运算。

下面用一个例子来验证上面的正确性。

例子:

public class Demo2 {

public static void main(String[] args){

Demo2 d = new Demo2();

d.method1();

d.method2();

}

public void method1(){

long start = System.nanoTime();

int i = 100;

int j = i*2;

System.out.println("乘法运算耗时:"+(System.nanoTime()-start));

}

public void method2(){

long start = System.nanoTime();

int i = 100;

int j = i<<1;

System.out.println("位移运算耗时:"+(System.nanoTime()-start));

}

}

输出:

乘法运算耗时

:46114

(单位纳秒)

位移运算耗时

:8016

(单位纳秒)

同时我简化上面的代码:

public class Demo2 {

public void method1(){

int i = 100;

int j = i*2;

}

public void method2(){

int i = 100;

int j = i<<1;

}

}

E:\>javac

Demo2.java

E:\>javap

-verbose Demo2 >> Demo.txt

查询字节码信息:

……

public void method1();

Code:

Stack=2, Locals=3, Args_size=1

0:bipush100

2:istore_1

3:iload_1

4:iconst_2

5:imul

6:istore_2

7:return

LineNumberTable:

line 7: 0

line 8: 3

line 9: 7

public void method2();

Code:

Stack=2, Locals=3, Args_size=1

0:bipush100

2:istore_1

3:iload_1

4:iconst_1

5:ishl

6:istore_2

7:return

LineNumberTable:

line 12: 0

line 13: 3

line 14: 7

}

从区别来看,位移运算调的是

ishl

(将

int

型数值左移位指定位数并将结果压入栈顶)指令,乘法运算调的是

imul

(将栈顶两

int

型数值相乘并将结果压入栈顶)指令。

整数乘法或整数除法所需要的时钟周期远远大于移位操作所需的时钟周期,下面列出这个指令的基本执行时间:

移位指令

寄存器移

1

时钟周期数为

2

整数乘法

IMUL

16

位寄存器乘

时钟周期为

128 ~ 154

整数除法

IDIV

16

位寄存器

时钟周期为

165 ~ 184

如果再要深究为什么,就要研究寄存器和电路图了的知识了

点到为止

..

参考资料:

0

1

分享到:

18e900b8666ce6f233d25ec02f95ee59.png

72dd548719f0ace4d5f9bca64e1d7715.png

2012-07-09 14:25

浏览 4923

评论

2 楼

ffchung

2014-01-15

這只是 init 的時間, 先行method2再行method1會有相反結果

1 楼

yanwushu

2013-01-10

一直不知道位移运算是干啥的,本文挺实用!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值