对于
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
位
时钟周期数为
2
整数乘法
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的移位运算涉及到整数类型数据的二进制位操作,这对于...移位运算常用于快速的乘法和除法,以及位掩码操作,比如在处理颜色像素或者内存布局优化时。了解这些运算符的工作原理对于编写高效、低级别的代码非常重要。
实验内容涉及设计多个组件,如ARICTL乘法运算控制器、移位寄存器SREG8B、与门ANDARITH、16位锁存器REG16B和8位加法器,最后将这些组件整合为一个完整的8位乘法器。 在Java实现八位乘法的过程中,我们通常会使用循环...
本项目是通过Java编程语言实现的,旨在计算跨中的位移,具体涉及到矩阵运算和线性代数的概念。 在有限单元法中,一个复杂的结构被划分为多个简单的单元,每个单元的特性可以通过其几何形状和材料属性来定义。然后,...
}`或`(x+y)^y`,通过位移和异或运算找到x的符号位,然后与x异或以消除符号位。 6. **取模和位运算**: - `a % (2^n) == a & (2^n - 1)`,当a和2^n没有溢出时,可以将取模运算转换为位与运算。 7. **乘法和位运算...
在二进制环境下,乘法可以通过位移和逻辑运算完成,除法则更加复杂,可能需要借助查找表或位操作。 4. **取模运算**:大数取模是计算一个数除以另一个数的余数,这在密码学中尤其重要,例如RSA公钥加密算法就依赖于...
8. 效率最高的乘法运算:在Java中,位移运算通常比算术运算更为高效。乘以8可以通过左移三位来实现,即2 相当于2 * 2 * 2 * 2 * 2 * 2 * 2,这样做是CPU直接支持的位运算,比普通的乘法运算要快。 9. 编程中的大数...
Java中的BigInteger类是用于处理大整数运算的重要工具,它弥补了Integer类在处理超过int类型范围(2^31-1)数值时的局限性。BigInteger类支持任意精度的整数运算,这意味着它可以准确地表示和计算非常大的数值,无论...
7. 32位MIPS运算器设计:构建一个32位的运算器,兼容MIPS指令集,包括加减乘除、逻辑运算以及位移操作,并具有溢出检测等功能。这里要求禁用Logisim自带的运算器,自定义设计所有功能。 实验中使用的32位运算器包含...
**乘法运算** 大整数的乘法可以采用长乘法算法,类似于小学的竖式乘法。也可以使用Karatsuba或FFT(快速傅里叶变换)等更高效的算法。例如,两个数123和456的乘法可以通过以下步骤完成: ``` 123 × 456 ------ ...
1. **Binary.java**: 这个文件可能包含了二进制操作的辅助类,因为RSA算法涉及到大量的位运算,比如大整数的二进制表示、位移操作等。二进制操作是RSA算法的基础,因为加密和解密过程中,原始数据通常会被转换为二...
5. **位移运算** `<< >> >>>` 6. **比较运算** `< > <= >= instanceof` 7. **相等运算** `== !=` 8. **按位与运算** `&` 9. **按位异或运算** `^` 10. **按位或运算** `|` 11. **逻辑与运算** `&&` 12. **逻辑或运算...
7. **利用位移运算替代乘法和除法**:在循环等性能敏感区域,位移运算(左移和右移)比乘法和除法更快。例如,乘以2可以表示为左移1位,除以2可以表示为右移1位。但要注意,这可能会降低代码的可读性。 除了这些...
### Java最新面试宝典知识点详解 #### 一、Java基础部分 **1.1 & 和 && 的区别** - **相同点**: `&` 和 `&&` 都可以用作逻辑与运算符,表示逻辑与(AND...- 位移运算比乘法运算更快,特别是在处理大整数时效率更高。
这个运算涉及复数的加法、乘法和位移,它是FFT效率的关键。在Java代码中,会有一个循环结构来执行这些运算,每次迭代都会更新部分结果。 5. **位翻转**:在计算FFT时,输入数据需要根据其位反序。这是因为FFT是基于...
8. 计算`2 * 8`最有效率的方式是直接使用`2 ,利用位移运算符进行快速乘法。 9. 设计一个能处理一百亿的计算器,需要考虑大数运算,可以使用`BigInteger`类处理大整数,并确保计算器的精度和性能。 10. 使用`final...
在实际应用中,可以使用更高级的库,如Java的BigInteger类或Python的内置大数支持,来简化大数运算。 总的来说,大数的四则运算在编程中是一种基础但重要的能力,特别是在需要处理大量数据或者进行精确计算的场景下...
- **知识点概述**:最高效的乘法运算之一是使用位移操作,如`2 表示2乘以8,这是因为位移操作是由CPU直接支持的,效率非常高。 ### 9. 设计一个百亿级别的计算器 - **知识点概述**: - 这一问题考察的是开发者对...
作为一个专业的IT工具,它允许用户执行包括加法、减法、乘法、除法以及位移、按位与、按位或、按位异或等在内的各种二进制运算。这些运算对于理解和处理二进制数据至关重要,尤其在计算机科学、编程、硬件设计等领域...