关于某加法程序的解释

作者: Bintou老师 | 来源:发表于2020-10-09 21:32 被阅读0次

2020年10月8日上午,给新生讲解二进制,留了一份作业,任务是理解下面加法程序,并回答问题。现在稍作解释。

问题描述

代码

//输入: 两个整数a和b
//输出: a与b的和
int add(int a, int b) {
    if (b == 0) return a;
    return add(a ^ b, (b & a) << 1);
}

问题

  • a \wedge b 得到的是什么?

  • (b \& a) << 1 得到的是什么?

  • 该算法为什么会终止?

解答

首先,同学们先要理解二进制的异或操作与与操作。其次,要理解什么是递归。这是基础。

然后,要理解到a \wedge b 是不考虑进位时a + b的值。思考二进制规则:0+0 = 00 + 1 = 11 + 1 = 0(忽略进位),即两个不同的比特“加”就是1,否则就是0,这就是所谓的“异或”操作。

那么进位值是什么呢?当然就是“与”操作得到的值,即a \& b。为什么呢?因为仅当两个比特都是1才产生进位。并且进位是加到前一个比特去,所以,要移位,即:(b \& a) << 1

最后一个问题,递归为何会终止?add函数终止的条件就是调用它时,第二个参数为0。注意到,第一次递归调用add的最后一位必然为0,因为左移的作用。最后一个比特为0的数值与任何数相加都不会产生进位,所以,第二次递归调用时第二个参数尾巴上至少有两个0。如此不断做下去,递归必然终止。

后话

以上内容或者我讲解的二进制内容,如果大家理解不了,这并不要紧,新生理解不了肯定是我没讲好,解释不清。这不是什么迫切、关键的东西,并且也不难,很快大家就会学到。但是,为什么我在大家大学第一课还没开始的时候就讲解二进制呢?理由只有一个:我希望大家学习的心情比某些同学主动学习的心情更为迫切。虽然这些内容不难,但是真正懂得这些、理解这些的同学太少!共勉!

相关文章

  • 关于某加法程序的解释

    2020年10月8日上午,给新生讲解二进制,留了一份作业,任务是理解下面加法程序,并回答问题。现在稍作解释。 问题...

  • 多一些世俗的快乐

    补看了某节目对潘粤明的采访 关于爱情 关于婚姻 他的解释 哦 不 说是解释倒不如说是 回避 不愿说但也努力去认清 ...

  • 线程的概念以及线程的生命周期

    在介绍线程之前,我们首先要了解一下进程。进程的官方解释:进程是计算机中的程序关于某数据集合上的一次运行活动,是系统...

  • 《深入理解Java虚拟机》十一:晚期(运行期)优化

    Java程序最初是通过解释器进行解释执行的,当某段代码(称为“热点代码”)运行特别频繁,为了提高效率,在运行时,虚...

  • 从加法中提高效率

    前几天写了《关于加法和减法的思考》,事后仔细想想,我把加法的概念和该文后边说的小习惯、小任务混淆了。 一,加法不但...

  • 我的C生活4(注释)

    ⒈注释可以用来解释某段程序或者代码的意思,方便程序员之间的交流。 比如:我在一行代码后面写上了注释,别人一看就知道...

  • python记

    今日所学: 关于编程: 何为编程,可以解释为编写程序,通过程序自动化的运行来解决生活中的问题。编程的目的是通过程序...

  • linux 常用命令

    一、命令 1、作用:为了实现某功能的特定的文件或程序 2、种类:内部命令、外部命令 内部命令存放于shell解释器...

  • cache原理与映射 - 草稿

    利用的原理:程序访问的局部性原理 (时间访问局部性和空间访问局部性) 解释:时间局部性是指如果程序中的某条指令一旦...

  • dart快速入门教程 (3)

    3.运算符 运算符本质上就是代表某运算规则的符号,例如: + ,这个符号,代表着数学运算里面的加法,按照加法法则进...

网友评论

    本文标题:关于某加法程序的解释

    本文链接:https://www.haomeiwen.com/subject/ynzjvctx.html