wtf???Java乘法会比位运算快??你一定是在逗我!!哈哈哈,当时也困扰了我,让我们继续向下看。

我们学习c的时候,都会遇到位运算快于乘法运算的情况,当时老师讲的是计算机只有加法运算,乘法运算的运算需要多次的进位和转换,所以位运算的效率要远远高于乘法运算。

管中窥豹,将相同的情况拿到了java中测试了一下,结果却和预想的不太一样,在相同的循环次数下,乘法运算和位运算的时间效率是交替着的,也就是说位运算和乘法运算有相近的计算效率。我们看下文来具体分析。

一、样例

Talk is weak, show me the code!
我们首先来看代码,各位看官可以直接拿下来跑一下。


public static void main(String []args){int a=2;int b=2;int aResult;int bResult;long startTime;long endTime;long time;//乘法运算startTime=System.currentTimeMillis();for(int i=0;i<250000000;i++){bResult=b*1024;}endTime=System.currentTimeMillis();time=endTime-startTime;System.out.println("乘法250000000次时间:"+time);//位运算System.out.println(Integer.toBinaryString(1024));startTime=System.currentTimeMillis();for(int i=0;i<250000000;i++){aResult=a<<10;}endTime=System.currentTimeMillis();time=endTime-startTime;System.out.println("位移100000000次时间:"+time);}

二、 结果

  • 运算结果一:

  • 运算结果二:

三、位运算的过程

上面的例子中,我们有第一句:

aResult=a<<10

这就是我们所说的位运算。
等价于:

bResult=b*1024;

其中我们输出了1024的二进制形式:

System.out.println(Integer.toBinaryString(1024));

结果为100000000000
最高位为第10位(从0开始计数),因此向左移位10位等同于数值乘1024。
所以两句话 (乘1024于<<10)是等价的
因此具有可比性。

四、产生这种情况的原因?

最开始我对出现的这种现象也产生了很大的疑惑,尤其是对于Java的乘法竟然有时候会比位运算还要快!
????wtf!
后来我对产生这种情况的原因进行了搜索,发现很少有对底层的计算过程进行讲解的文章,大部分是人云亦云,亦有很多是直接拷贝的别人的博客,而且不加验证!!我想说,你们这样误导别人真的好吗!!!真的很痛心,虽然个人感觉对别人的知识进行摘取并不可耻,但也要加以验证,并从中产生自己的思考,这才是真正有意义的,并且对别人也是极有帮助的。每个人人云亦云,真的是 **!

初步猜测:

  1. java在计算乘法的时候一定采取了优化
    不然按照之前的理论和实际,位运算肯定是要比乘法要慢得多,所以一定是java在计算时对过程进行了改造。

  2. 那么采用了什么优化呢?
    个人猜测java在底层将乘法转化成了位运算,所以会有和位运算相近的运算时间。也就是上面我们说的运行时间总是在1234之间浮动,且大部分为2(运行时间根据不同的机器会有存在一定的差异,不能一概而论)。

  3. 那么为什么会产生有时快有时慢的交叉的情况呢?
    这就要从操作系统的底层思考了。我们都知道类似windows,linux,macos都是分时操作系统,cpu计算快,而数据的传输较cpu的运算要慢上万的数量级,因此在操作系统为每一个进行分配了时间片,在运行时间片为0时,便把该进程切换下来,换下一个进程,这也就是为什么我们能够同时运行许多不同的程序的原因。(快到我们以为程序是在同时运行着)
    在我们运行测试样例的时候,产生了cpu的调度和进程切换,电脑的cpu分配了时间给其他的进程,影响了速度,所以会产生数值上少量的差异。

Java位运算不一定比乘法快 (关于java数据运算的一些思考)相关推荐

  1. java 本地内存_哪个更快:Java堆还是本地内存

    使用Java的一个好处就是你可以不用亲自来管理内存的分配和释放.当你用new关键字来实例化一个对象时,它所需的内存会自动的在Java堆中分配.堆会被垃圾回收器进行管理,并且它会在对象超出作用域时进行内 ...

  2. Java位运算优化:位域、位图棋盘等

    快速小测试:如何重写下面的语句?要求不使用条件判断语句交换两个常量的值. if (x == a) x= b; else x= a; 答案: x= a ^ b ^ x; //此处变量x等于a或者等于b ...

  3. 小博老师解读经典Java面试题—Java位运算

    [面试原题] 我们经常会看到类似于下面这样的Java面试题: 请编写出效率最高的2乘以8的运算结果. [正确答案] 2<<3 [面试技术点] 面试者是否了解.灵活运用java位运算技术. ...

  4. java位运算符和位运算表达式

    java位运算符和位运算表达式 > 右移 x>>a X各比特位右移a位 << 左移 X< >> 不带符号的右移 x>>>a X各比特位 ...

  5. Java 位运算和普通运算,效率比较

    java位运算与乘法速度比较实例源码介绍这里我主要和大家一起讨论乘法与位运算.一直以来,很多人都认为位运算要比乘法执行效率高,我一直也是这样认为的,但是真的是这样的吗?让我们看下面的代码: packa ...

  6. java位运算究竟有用么?

    背景:java位运算除了课本上老师讲过,有时候面试的时候为了凸显高大尚,也会问些皮毛,难道真是一无是处么?本文主要从两方面进行叙述,什么是位运算,以及它的使用场景. 1    位运算简介 说明:  & ...

  7. Java位运算之2的N次幂、整数转换、寻找只出现一次的数

    Java位运算 位运算:只能对整数进行位运算,可加快计算机计算速度.因为所有数在内存中都是以二进制存放,故直接对数的二进制位进行操作非常快,比如乘法.除2操作:通过左右移二进制位即可,无需将数转为十进 ...

  8. 我们应该知道的java位运算

    最近又回去重新看了java基础的书籍,在记录总结以前一些比较容易混淆的知识点.下面是本篇要记录的内容 一. 相关基础概念 在开始java位运算的知识之前,我们先来了解几个基础的概念,机器数,真值,原码 ...

  9. java 字符串 移位_使用位运算、值交换等方式反转java字符串-共四种方法

    在本文中,我们将向您展示几种在Java中将String类型的字符串字母倒序的几种方法. StringBuilder(str).reverse() char[]循环与值交换 byte循环与值交换 apa ...

最新文章

  1. debian nvidia 安装_【折腾】openSUSE安装与配置——从入门到放弃
  2. 语言检测工具-langid
  3. python3.6下载百度云_Python3.6零基础入门与爬虫案例开发教程
  4. Maven搭建简单的SS项目
  5. 我与TCP连接不得不说的故事
  6. 7000更换控制器电源步骤_开关电源控制环路(初级篇:上)
  7. K8S精华问答 | 应用和运行时平台是怎样解耦的?
  8. 记录excel翻车现场
  9. 桂林理工大学计算机研究调剂,2018年桂林理工大学考研调剂信息
  10. 控制台异常:Could not connection
  11. 7z替换exe文件内容不能替换文件_Windows小技巧 批处理文件实现目录下文件批量打包压缩...
  12. ubuntu 常用配置
  13. php整数型转字符串,php如何将整数转为字符串
  14. MySQL 语法整理(2)
  15. 为什么重写Equals方法要重写HashCode方法
  16. JBPM4.4学习使用
  17. Ubuntu安装已下载了.deb文件的软件
  18. 黑马程序员_日记9_Java学习感言
  19. TI CC32XX SDA中SimpleLink Academy教程翻译(RTOS部分的基础介绍非常易懂)
  20. 如何将优酷KUX格式转换为MP4格式?

热门文章

  1. USBKiller V2.2 b1119网络特别版
  2. 倩女幽魂手游服务器维护多久,倩女手游维护到几点 倩女幽魂要维护到几点看系...
  3. 极速下载git hub 客户端
  4. 热工仪表及控制实训装置
  5. 怎样拥有心灵的平和?获得一颗全新的心灵
  6. oTMS携手阿里云:互联互通运输管理软件背后的大数据升级
  7. 波士顿房价分析作业总结
  8. php案例:创建日期时间目录
  9. 诺基亚3d贪吃蛇java版_诺基亚3D贪吃蛇游戏下载-游戏大玩家
  10. Linux环境下,通过shell脚本实现一键部署MySQL,并支持多种类型