对于
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位运算操作 左位移 右位移 与或非的操作
简单小工具,输入十进制数值计算结果,C# WINFORM版,非源码
所有的整数类型以二进制数字位的变化及其宽度来表示。例如,byte 型值42的二进制代码是00101010 ,其中每个位置在此代表2的次方,在最右边的位以20开始...注意右移后的值与0x0f进行按位与运算,这样可以舍弃任何的符号...
计算机组成原理 带位移运算模型机的设计与实验:包括实验要求,内容,步骤,总结等。。。
位移计算图乘法PPT学习教案.pptx
结构位移计算图乘法PPT学习教案.pptx
指针,算术,位移运算开发包部份示例代码[AsmInVB].
java基本类型转byte,设计原码、补码、反码、左右位移等知识,赚点积分
绝对韩顺平老师的讲解视频!教学文件打包太大,就一个一个的上传了! avi格式的,最好用KMPlayer来播放,下载地址:https://www.kmplayer.com/home 后续还上传,韩顺平老师教学的源代码!
以下面的格式提供运算表达式:$(( expression )) $ echo $((5*(3+3))) 30 $ result = $(($myvar-10)) shell提供方便的数之间的进制转换: $ echo $((013))#八进制 $ echo $((0xA4))#十六进制 还可以使用以下格式指定...
本资料集为C语言进阶学习者提供了全面的预处理、文件处理、结构体和位移运算的知识。内容涵盖了从基础语法到高级应用的各个方面,旨在帮助学习者深入理解C语言的核心概念和技术细节。 适用人群 本资料适合具有C语言...
这是一个java程序,使用了中点位移法自动生成分形山,在上面还提供了一些注释,可以作为课程设计的参考资料
这是一个关于测试C语言中整数移位运算的MFC应用程序,界面中标志表示左移或者右移,移位数输入要移的位数,还有输入整数,和输出结果,按钮是用来操作,很方便用来测试
动物位移小游戏Java实现,强行使用上了SQLite和MyBatis.zip动物位移小游戏Java实现,强行使用上了SQLite和MyBatis.zip动物位移小游戏Java实现,强行使用上了SQLite和MyBatis.zip动物位移小游戏Java实现,强行使用上...
文件移位加密与解密 C语言实现 完整代码 截图显示
不错的主要用于加密的vbs(asp)位移运算类
通过位运算中的"^"异或运算符把字符串与一个指定的值进行异或运算,从而改变字符串每个字符的值,这样就可以得到一个加密后的字符串
文中主要讲解了负数移位的实现过程。
计算机组成原理 带移位运算模型机的设计与实现
用位移指令实现两个数的乘法。有两个字节的类型的无符号数,用位操作指令和加发指令实现手工相乘,并将结果存放在一个16位的寄存器中。