给定两个int A和B。编写一个函数返回A+B的值,但不得使用+或其他算数运算符。
测试样例:
1,2
返回:3
import java.util.*;
/*
思路:肯定是用位运算,我记得位运算A^B是不考虑进位的结果,(A&B)<<1是求得的进位
因此A^B+(A&B)<<1的结果就是和,只要(A&B)<<1=0,两项就变成了一项,不需要加法了
*/
public class UnusualAdd {
public int addAB(int A, int B) {
if(B!=0){
int a=A^B;
int b=(A&B)<<1;
return addAB(a,b);
}else{
return A;
}
}
}
运行时间:82ms
占用内存:8912k
import java.util.*;
public class UnusualAdd {
public int addAB(int A, int B) {
int carry=(A&B)<<1;
A=A^B;
B=carry;
while (B!=0)
{carry=(A&B)<<1;
A=A^B;
B=carry;
}
return A;
}
} public int addAB(int A, int B) {
int xor,and;
while(B!=0){
xor = A^B;
and = (A&B)<<1;
A=xor;
B=and;
}
return A;
}
class UnusualAdd {
public:
class Add
{
public:
Add()
{
++_i;
}
};
int addAB(int A, int B) {
_i = 0;
Add arr1[A];
Add arr2[B];
return _i;
}
private:
static int _i;
};
int UnusualAdd::_i = 0; class UnusualAdd {
public:
int addAB(int A, int B)
{
if(A==0)
return B;
if(B==0)
return A;
return addAB(A^B,(A&B)<<1);
}
}; /*
思路:使用位运算
a:1 0 1 0
b:0 1 1 0
a b异或得到的是不进位的结果
1 1 0 0
a b相与得到的是需要进位的数字
0 0 1 0
因此我们完全可以把B当作进位来处理。
*/
class UnusualAdd {
public:
int addAB(int A, int B) {
//我们把B当作进位,只有当进位是0的时候,才说明不用运算了
while(B!=0){
//获取不进位数值
int a=A^B;
//获取进位数值
int b=(A&B)<<1;
//A变成新的不进位数值
A = a;
//B变为新的进位数值
B = b;
}
return A;
}
};