使用位运算符的现场笔试题目
我们在很多编码大赛中也能看到许多高人、大咖们利用二进制数与位运算符展示了各种让人纠结却又惊奇的代码,作为计算机基础,二进制也成为了很多企业考察招聘人员的重点之一. 今天我们就来看一道要求使用经典的位运算符进行现场编程的笔试题,话不多说,直接看题:
Calculate the sum of two integersaandb, but you are not allowed to use the operator+and-.
Example:
Givena= 1 andb= 2, return 3.
首次看到这样的题目,相信很多应聘人员都是头脑迷糊,所以我们今天就来仔细分析下这道现场编程题,到底用什么位运算符以及怎么实现加法?
位运算基本理论
一 、位运算符
用位运算实现加法也就是计算机用二进制进行运算,自然离不开位运算符:
二、异或运算
我们所要实现的加法,先用1位数的加法来演示且不考虑进位,如下
很明显上述的表达式可以用位运算的“^”来代替,如下:
这样我们就完成了简单的一位数加法,那么要进行二位的加法,这个方法可行不可行呢?肯定是不行的,矛盾就在于,如何去
获取进位?
三、定理
我们思考以下问题:
从上面我们可以发现规律:
在位运算中,我们用“<<”表示向左移动一位,也就是“进位”。那么我们就可以得到如下的表达式,进位可以用如下表示:
(x&y)<<1
综上所述我们得到以下两个表达式:
x^y //执行加法
(x&y)<<1 //进位操作
下面我们来做个2位数的加法,不考虑进位:
11+01 = 100 // 本来的二进制算法
// 用推算的表达式计算
11 ^ 01 = 10
(11 & 01) << 1 = 10
由于题目要求我们不能使用加法符号,所以要想别的方法,我们再来看两位二进制数按上述算法计算的过程:
10 ^ 10 = 00
(10 & 10) << 1 = 100
到这里基本上就得出结论了,其实后面的那个 “00” 已经不需要再计算了,因为第一个表达式就已经算出了结果,所以我们有以下定理:
Python解题
根据上述定理,我们就能实现题目要求,话不多说,直接上代码