当前位置:首页 > 开发 > 编程语言 > Java > 正文

java 位移运算与乘法运算

发表于: 2012-07-09   作者:周凡杨   来源:转载   浏览:
摘要:   对于 JAVA 编程中,适当的采用位移运算,会减少代码的运行时间,提高项目的运行效率。这个可以从一道面试题说起:     问题: 用最有效率的方法算出2 乘以8 等於几?” 答案:2 << 3 由此就引发了我的思考,为什么位移运算会比乘法运算更快呢?其实简单的想想,计算机的内存是用由 0 和 1 组成的二

 

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

 

  问题:

用最有效率的方法算出2 乘以8 等於几?”

答案: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:	bipush	100
   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:	bipush	100
   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         时钟周期数为
整数乘法 IMUL        16 位寄存器乘         时钟周期为 128 ~ 154
整数除法 IDIV        16 位寄存器            时钟周期为 165 ~ 184

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

 

参考资料:

http://www.programfan.com/blog/article.asp?id=32217

http://blog.csdn.net/kypfos/article/details/810151

http://budairenqin.iteye.com/blog/1565750

 

java 位移运算与乘法运算

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
文章看过后感觉受益匪浅,所以留下了以备温故:http://www.congmo.net/blog/2012/03/11/Long-ByteSh
描述:位移可以总结为四个字——左乘右除 公式描述: shifting k-bits to the right: O(i,j) = I(i,
描述:和其它图像操作一样,图像的乘法操作也是点对点的像素点进行操作 公式描述:O(i,j) = I1(i,j)
一、简介 Java中所有的数据都是以二进制数据的形式进行计算的,即如果有一个int型变量,要采用位运
昨天做排列组合的时候遇到A(a,b)这个问题,需要计算A(20,20)超大,计算机32位的,最大数只能是2^3
<pre name="code" class="cpp">输入两个矩阵。输出矩阵乘法运算的结果,如果不能进行矩阵乘法
两个同为510258个数字字符进行大整数相乘 在AMD 5000+ 2G内存机器上运行的效果(时间不算输出):
基本数据类型 int n = 7, m = 2; double d = 7; n = n/m; //3 d /= m; //3.5 n--; //2 int a = 2 * n
最近在看笔试题,得知大数运算是个经常考的题目。所以有兴趣试了试。 一开始按照笔算方法自己写了个
本例程实现的是,从外部输入两个32位有符号小数,进行乘运算,输出的乘积为32位有符号小数。 1 modu
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号