java 乘法 位移_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: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
如果再要深究为什么,就要研究寄存器和电路图了的知识了
…
点到为止
..
参考资料:
http://www.programfan.com/blog/article.asp?id=32217
http://blog..net/kypfos/article/details/810151
http://budairenqin.iteye.com/blog/1565750
java 乘法 位移_java 位移运算与乘法运算相关推荐
- java符号位_java 位运算符号
<道生一,一生二,二生三,三生万物>出自老子的<道德经>第四十二章.主要讲述了一.二.三这几个数字,并不把一.二.三看作具体的事物和具体数量.它们只是表示"道&quo ...
- java加减_Java位运算实现加减乘除
一.加法 a+b 举例实现:13+9=22 13+9不考虑进位结果为12 只考虑进位结果为10 和刚好是22. 13二进制为1101,9二进制为1001. 不考虑进位结果为0100.算式为a^b 只考 ...
- java乘法表_Java中四种9*9乘法表的实现方式(附代码)
前言: 初学java,实现99乘法表是必学必会的内容. 需求 : 分别写出上下左右,对应四个角的乘法表. 思路: 可以先打印出*星星,形成一个直角三角形,然后再替换成乘法公式. 代码如下: publi ...
- java位反_JAVA位运算之按位取反
一直纠结于位运算中的 按位取反 以及原码.反码.补码之间的各种关系,反正各种混淆各种懵逼.经过一小段时间才弄明白这个别人觉得很容易的问题.可能还是我基础不太好. 位运算是对操作数以二进制为单位的进行的 ...
- java中的位移运算符_Java 位移运算符
本人只是 Android小菜一个,写技术文档只是为了总结自己在最近学习到的知识,从来不敢为人师,如果里面有些不正确的地方请大家尽情指出,谢谢! 1.概述 Java 位移运算符是Java中基本的位运算操 ...
- java简单运算程序_JAVA实现简单四则混合运算
JAVA实现简单四则混合运算,说明:该计算器支持实则混合运算,如 2*(3+1 )/ 4-3 *9+ 8/ 3*4- 5,则输出:-19.333332 需要说明的事括号必须是英文的.源码如下仅供学习: ...
- java 除法取整_java 除法运算只保留整数位的4种方式
1.情景展示 根据提供的毫秒数进行除法运算,如果将毫秒数转换成小时,小时数不为0,则只取整数位,依此类推... 2.情况分析 可以使用3个函数实现 Math.floor(num) 只保留整数位 Ma ...
- java 不用中间变量_java异或运算不使用中间变量交换两个数(Java版)详细分解...
Java的异或运算^,这个小不点"^"就是Java的异或运算符,其特性如下:真^假=真假^真=真 假^假=假 真^真=假,它却是说明了Java异或运算的基本法则,那就是:只要两个条 ...
- java只保留整数_java 除法运算只保留整数位的4种方式
1.情景展示 根据提供的毫秒数进行除法运算,如果将毫秒数转换成小时,小时数不为0,则只取整数位,依此类推... 2.情况分析 可以使用3个函数实现 Math.floor(num) 只保留整数位 Ma ...
最新文章
- XHTML标准下的100%高度问题
- android SQLite 批量插入数据慢的解决方案 (针对于不同的android api 版本)
- 开源物联网通讯框架ServerSuperIO,成功移植到Windows10 IOT,在物联网和集成系统建设中降低成本。附:“物联网”交流大纲...
- 数据结构之判断一棵树是不是完全二叉树
- 爬虫:突破有道翻译js加密(最新)
- 2021年广东副高考试成绩查询,广东省中山市2021年高级会计师考试成绩可以查询了吗?...
- 问题记录_初始化带有string的结构体
- LVS负载均衡DR模式部署
- 我摸鱼写的Java片段意外称霸Stack Overflow十年、征服6000多GitHub开源项目: 有bug!...
- tensorflow numpy版本匹配_在Matlab中使用tensorflow (1)
- 高斯消元解同余方程组
- python_入门初级
- 什么是 Hadoop 生态系统
- 雷人:微软CEO鲍尔默因员工用iPhone动怒
- 欧姆龙多PLC串行链接模式的应用
- 除了字节,腾讯也来“抢”阿里的这门生意
- iOS 常见的URL Schemes
- 基于Windows AD的单点登录系统
- 小米电视4s android,小米电视系列ROOT教程(含4A,4S,4X等Android6.0.1版机型)
- CSP 202009-4 星际旅行
热门文章
- 窗口刷新 Invalidate UpdateWindow RedrawWindow
- SQLite中的SQL
- 计算机辅助语言和计算语言学关系,建构主义理论视角下计算机辅助语言学习环境对留学生学习汉语动机的影响——以广西大学泰国留学生为例-语言学及应用语言学专业论文.docx...
- java 找不到方法,已经定义的方法找不到
- 小米路由器mini改打印服务器_如何把家里的闲置路由器用起来
- Python 数据分析与展示笔记3 -- Matplotlib 库基础
- 华夏银行北京分行签约第四范式智能决策平台
- 【机器学习基础】八种应对样本不均衡的策略
- 【Python入门】Python字典的11个方法超级详解
- 【实战】用机器学习来提升你的用户增长