Calculate the sum of two integers a and b, but you are not allowed to use the Operator + and -. 计算两个整数a和b的和,但不允许使用运算符+和 - 。
如果不能用加减运算,那还能有什么运算方法呢?当然了,还有亲切的位运算。
和平时做加减法一样,先各个位相加,然后得到的数再相加,注意:期间要考虑进位情况(有时候多次进位,比如:9999+1=10000)
二进制的两个数相比较无非三种情况: 1———–1———–0 0———–1———–0 相加后结果: 1———–0———–0 不进位|||进位1|||不进位
a 00101 b +11100 A.先考虑1+0以及0+0不会进位的两种情况,此时假使1+1=0(分开考虑是否进位两种情况),则容易想到用亦或^(相同为零,不同为一)运算。设c=a^b,则: c.1 11001 B.其次考虑进位情况,1+1=10进一位,可以先使1+1=1后整个数字向左移动一位变为10,即"<<1",要使1+1=1,且0+0=0,且1+0或0+1=0的方法就是按位与&(全为一得一,其他全为零)运算。于是设d=(a&b)<<1,则: d.1 01000 //事情到这里就结束了吗?我本来以为是的,喜洋洋的写了个“return ((a&b)<<1)^(a^b)"就上交了,结果试了几个数发现有对有错了,想了下,哎呀,忘进位了,这家伙还是个循环哩。 于是就有了c.1+d.1的运算:重复上面的运算,这不挺像递归的吗?让我试试有啥需要注意的,递归总要做到参数对应吧。 c.2 10001 d.2 10000 c.3 00001 d.3 100000 这最后一次运算就要返回答案了 c.4 100001 d.4 00000 也就是说c对应a,d对应b,且结束的条件是b==0,于是就有了下面的代码:当然了也可以用for循环来解答,当符合条件的时候跳出循环(break) 也可以是while。。。
以后做题还是要细心啊
新闻热点
疑难解答
图片精选