`
周凡杨
  • 浏览: 235089 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java 位移运算与乘法运算

阅读更多

 

对于 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

 

0
1
分享到:
评论
2 楼 ffchung 2014-01-15  
這只是 init 的時間, 先行method2再行method1會有相反結果
1 楼 yanwushu 2013-01-10  
一直不知道位移运算是干啥的,本文挺实用!

相关推荐

    JAVA基础之java的移位运算

    Java的移位运算涉及到整数类型数据的二进制位操作,这对于...移位运算常用于快速的乘法和除法,以及位掩码操作,比如在处理颜色像素或者内存布局优化时。了解这些运算符的工作原理对于编写高效、低级别的代码非常重要。

    EDA八位乘法的java实现

    实验内容涉及设计多个组件,如ARICTL乘法运算控制器、移位寄存器SREG8B、与门ANDARITH、16位锁存器REG16B和8位加法器,最后将这些组件整合为一个完整的8位乘法器。 在Java实现八位乘法的过程中,我们通常会使用循环...

    有限单元法求解跨中的位移java实现

    本项目是通过Java编程语言实现的,旨在计算跨中的位移,具体涉及到矩阵运算和线性代数的概念。 在有限单元法中,一个复杂的结构被划分为多个简单的单元,每个单元的特性可以通过其几何形状和材料属性来定义。然后,...

    java经典位运算实例宣贯.pdf

    }`或`(x+y)^y`,通过位移和异或运算找到x的符号位,然后与x异或以消除符号位。 6. **取模和位运算**: - `a % (2^n) == a & (2^n - 1)`,当a和2^n没有溢出时,可以将取模运算转换为位与运算。 7. **乘法和位运算...

    大数运算包含加,减,乘,除,取模,幂运算,模幂运算。支持十进制运算,二进制运算.zip

    在二进制环境下,乘法可以通过位移和逻辑运算完成,除法则更加复杂,可能需要借助查找表或位操作。 4. **取模运算**:大数取模是计算一个数除以另一个数的余数,这在密码学中尤其重要,例如RSA公钥加密算法就依赖于...

    Java+Android面试题大全

    8. 效率最高的乘法运算:在Java中,位移运算通常比算术运算更为高效。乘以8可以通过左移三位来实现,即2 相当于2 * 2 * 2 * 2 * 2 * 2 * 2,这样做是CPU直接支持的位运算,比普通的乘法运算要快。 9. 编程中的大数...

    Java大数字运算之BigInteger <font color=red>原创</font>

    Java中的BigInteger类是用于处理大整数运算的重要工具,它弥补了Integer类在处理超过int类型范围(2^31-1)数值时的局限性。BigInteger类支持任意精度的整数运算,这意味着它可以准确地表示和计算非常大的数值,无论...

    运算器实验V1.11

    7. 32位MIPS运算器设计:构建一个32位的运算器,兼容MIPS指令集,包括加减乘除、逻辑运算以及位移操作,并具有溢出检测等功能。这里要求禁用Logisim自带的运算器,自定义设计所有功能。 实验中使用的32位运算器包含...

    大整数加减乘除运算

    **乘法运算** 大整数的乘法可以采用长乘法算法,类似于小学的竖式乘法。也可以使用Karatsuba或FFT(快速傅里叶变换)等更高效的算法。例如,两个数123和456的乘法可以通过以下步骤完成: ``` 123 × 456 ------ ...

    RSA-IMPLEMENTATION-IN-JAVA.zip_in_java_rsa java

    1. **Binary.java**: 这个文件可能包含了二进制操作的辅助类,因为RSA算法涉及到大量的位运算,比如大整数的二进制表示、位移操作等。二进制操作是RSA算法的基础,因为加密和解密过程中,原始数据通常会被转换为二...

    Java编程基础语法

    5. **位移运算** `&lt;&lt; &gt;&gt; &gt;&gt;&gt;` 6. **比较运算** `&lt; &gt; &lt;= &gt;= instanceof` 7. **相等运算** `== !=` 8. **按位与运算** `&` 9. **按位异或运算** `^` 10. **按位或运算** `|` 11. **逻辑与运算** `&&` 12. **逻辑或运算...

    java优化java优化

    7. **利用位移运算替代乘法和除法**:在循环等性能敏感区域,位移运算(左移和右移)比乘法和除法更快。例如,乘以2可以表示为左移1位,除以2可以表示为右移1位。但要注意,这可能会降低代码的可读性。 除了这些...

    Java最新面试宝典

    ### Java最新面试宝典知识点详解 #### 一、Java基础部分 **1.1 & 和 && 的区别** - **相同点**: `&` 和 `&&` 都可以用作逻辑与运算符,表示逻辑与(AND...- 位移运算比乘法运算更快,特别是在处理大整数时效率更高。

    java 的FFT源程序

    这个运算涉及复数的加法、乘法和位移,它是FFT效率的关键。在Java代码中,会有一个循环结构来执行这些运算,每次迭代都会更新部分结果。 5. **位翻转**:在计算FFT时,输入数据需要根据其位反序。这是因为FFT是基于...

    2013java面试宝典

    8. 计算`2 * 8`最有效率的方式是直接使用`2 ,利用位移运算符进行快速乘法。 9. 设计一个能处理一百亿的计算器,需要考虑大数运算,可以使用`BigInteger`类处理大整数,并确保计算器的精度和性能。 10. 使用`final...

    大数的四则运算(附代码)

    在实际应用中,可以使用更高级的库,如Java的BigInteger类或Python的内置大数支持,来简化大数运算。 总的来说,大数的四则运算在编程中是一种基础但重要的能力,特别是在需要处理大量数据或者进行精确计算的场景下...

    柯莱特Java面试题收集

    - **知识点概述**:最高效的乘法运算之一是使用位移操作,如`2 表示2乘以8,这是因为位移操作是由CPU直接支持的,效率非常高。 ### 9. 设计一个百亿级别的计算器 - **知识点概述**: - 这一问题考察的是开发者对...

    CE二进制运算器正式版

    作为一个专业的IT工具,它允许用户执行包括加法、减法、乘法、除法以及位移、按位与、按位或、按位异或等在内的各种二进制运算。这些运算对于理解和处理二进制数据至关重要,尤其在计算机科学、编程、硬件设计等领域...

Global site tag (gtag.js) - Google Analytics