题目:写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。
示例:
输入: a = 5, b = 17
输出: 22
题目分析:
第一步:不进位加法。相加各位的值,不算进位,得到12。
第二步:记录进位。5+17中十位要进一,因此表示10。
第三步:将前面的结果相加: 12+10=22。
第一步和第二步皆可以利用逻辑操作代替。
第一步:逻辑异或(相同为0,不同为1)。5的二进制表示为:00101B,17的二进制表示为10001B ,逻辑异或操作为 10100B。
第二步:逻辑与(二者皆为1的时候为1,其他都是0)。5和17进行逻辑与操作为1B,向左移动一位 得到10B,这才能表示高位对应的权值。
第三步:重复第一步,不过当前的值为10100B^10B,异或得到10110B。
第四步:重复第二步,10100B&10B=0,说明没有进位,向左移动也还是0。边界条件出现,直接返回第三步的值10110B,即 22。
Java代码:
/**
* 写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。
*
* 示例:
* 输入: a = 1, b = 1
* 输出: 2
*/
public class Offer65 {
// 官方答案,更加精炼。佩服!
public int add(int a, int b) {
while (b!=0){
int xr = a^b;
b = (a&b)<<1;
a = xr;
}
return a;
}
// 自己根据官方思路写的代码。
public int add1(int a, int b) {
int xor = 0;
int and = 0;
while (b!=0){
xor = a^b;
and = (a&b)<<1;
a = xor;
b = and;
}
return a;
}
public static void main(String[] args) {
Offer65 offer65 = new Offer65();
int result = offer65.add1(6,-9);
System.out.println(result);
int result1 = offer65.add1(6,0);
System.out.println(result1);
int result2 = offer65.add1(0,49);
System.out.println(result2);
}
}
【注】
(1):leetcode 等平台只要我们完成一个函数即可,本人初出茅庐,为了巩固基本知识,故自己补充了部分代码,用于练手。本代码也许存在漏洞,望高手赐教。感谢!