给出两个整数a和b, 求他们的和, 但不能使用 +
等数学运算符
你不需要从输入流读入数据,只需要根据aplusb
的两个参数a和b计算他们的和并返回就行。
a和b都是 32位
整数么
我可以使用位运算符么?
首先肯定要想到用位运算来操作即用二进制来处理,好既然想到这里,当然要举个例子来想想最简单的1+2
那a+b不就等于a|b吗?那么再来验证下1+3
发现之前的猜想错误了,然后再经过一些其他简单的验算我们会轻而易举的发现一个规律,如果没有进位那么a+b = a|b 如果有进位就不成立。
所以接下来要处理进位的问题我们在用1+3来研究下进位的问题,如果我们忽略有进位的位置后再加上应该进位的位置,就是我们的值
我们的值应该是c+d(但是c和d还是有进位,那么再重复上述操作)即:
以上叙述是Copy的某博客的心得 原文章地址在这里
但是,原文章犯了个致命的错误:没有想到a b为负数的情况
在经历了一翻寻找后找到的所有代码基本上都为抄这篇博客的
代码,这让我非常崩溃。
对于位运算一无所知的我只能从头分析二进制加减法运算规
为未知数所以算完等号右边后应执行反补码的操作。也就是
等号右边-1再求反码
正负。所以设定了t1 t2用来判断a|b的正负性
4.与本题无关 负数补码的补码就是负数补码的相反数,
而不是单纯的用定义求负数的补码的補码。比较绕