程序如何运行的

在写代码的时候,我们直接在没有编译报错的时候,直接点击运行后,ide会直接把程序的结果输出到控制台上,代码如下:

   public static void main(String[] args) { 
		int i=17;
		int j=5;
		int sum=i+j;
		System.out.println(sum);
	}

这段代码最终的结果是在控制台上面打印出:22,但是这个结果到底是怎么被执行的呢?

CPU能做什么

在硬件的世界里面,只有0和1,就是这么简单的0和1,到底是怎么做加法的呢?

我们知道CPU的功能是执行指令,有三个简单的基本操作:与,非,或三种运算。在加上位的运算一种有5种:&,|,~,«,». 利用这个几个运算如何实现代码中的15+5的运算?

首先,把加法拆解,分成两个部分: 把个位和个位相加,如果有进1的话,就用进1的值十位与另一个十位相加。得到的和在进行相加。

  1. 把15+5进行拆解就是 7+5=12,发现5+5有进位10;
  2. 利用进位的十位与10+10 =20
  3. 再把两个的和相加,20+2=22 ,没有再进位,运算结束。

根据上面的分析,我们可以使用递归的方法,写出加法的位运算代码如下:

	static int add(int i, int j){
		if(j == 0)
			return i;
		int sum = i ^ j;//得到个位相加
		int carry = (i & j) << 1;//得到进位相加
		return add(sum, carry);
	}

对这个算法进行封装成一个CPU指令,我们就可以利用二进制进行进行运算。

Java代码最终的编译结果

我们知道java的代码最终是经过编译器,转换成字节码最终由JVM解释执行,具体过程如下:

当java代码最终转换成字节码的时候,JVM虚拟机执行对应的字节指令,最终传递给CPU来执行代码,CPU计算的过程我们已经分析过,最终会调用位运算来实现加法。

CPU是如何实现位运算的呢?

(本文完)

作者:老付 如果觉得对您有帮助,可以下方的订阅,或者选择右侧捐赠作者,如果有问题,请在捐赠后咨询,谢谢合作 如有任何知识产权、版权问题或理论错误,还请指正。 自由转载-非商用-非衍生-保持署名,请遵循:创意共享3.0许可证 交流请加群113249828: 点击加群 或发我邮件 laofu_online@163.com

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏mini188

学习笔记:因为java匿名类学习到接口的一些小用法

在看CometD的示例代码时发现了许多有意思的代码,但说实话看别人的代码确实是件很累的事情,所以就看到这个知识点做一下记录吧。 先看一段代码: ? 代码1 这段...

2168
来自专栏Python小屋

暴力测试也疯狂——论Python代码优化

问题描述:在123456789这9个数字中间插入任意多个+和-的组合,使得表达式的值为100,输出所有符合条件的表达式。 对于该问题,前天推送了一个暴力测试的代...

3374
来自专栏企鹅号快讯

PHP中被忽略的性能优化利器:生成器

如果是做Python或者其他语言的小伙伴,对于生成器应该不陌生。但很多PHP开发者或许都不知道生成器这个功能,可能是因为生成器是PHP5.5.0才引入的功能,也...

38614
来自专栏程序员的知识天地

Python两步实现网页天气爬虫程序

说道爬虫大家或许感觉非常神秘,其实它没有我们想象的那么神奇,今天我们就来揭开它神秘的面纱。呵呵,简单两步就可以实现一个网页天气爬虫程序。。。

1571
来自专栏栗霖积跬步之旅

java多线程编程核心技术——第五章总结

定时器Timer的使用   在JDK中Timer类主要负责计划任务的功能,也就是在指定的时间开始执行某一个任务。 ?   Timer类的主要作用是设置计划任务,...

1959
来自专栏玄魂工作室

看代码学安全(11) - unserialize反序列化漏洞

大家好,我们是红日安全-代码审计小组。最近我们小组正在做一个PHP代码审计的项目,供大家学习交流,我们给这个项目起了一个名字叫 PHP-Audit-Labs 。...

1223
来自专栏MyBlog

Effective Java 读书笔记(7)避免finalizer

对于Finalizers他们的使用可能会造成错误的产生,糟糕的性能以及移植性的问题,当然Finalizers有着一些有用的优点,我们会在后续介绍这些,但是作为首...

1052
来自专栏每日一篇技术文章

Swift3.0 - 异常错误

801
来自专栏linux驱动个人学习

Linux 内存池【转】

1445
来自专栏青玉伏案

算法与数据结构(十二) 散列(哈希)表的创建与查找(Swift版)

散列表又称为哈希表(Hash Table), 是为了方便查找而生的数据结构。关于散列的表的解释,我想引用维基百科上的解释,如下所示: 散列表(Hash tab...

25410

扫码关注云+社区