一、简单做法
1、两整数之和
int getSum(int a, int b) {
return a+b;
}
2、不用加号的加法
int add(int a, int b) {
return a+b;
}
3、不用加减乘除做加法
int add(int a, int b) {
return a+b;
}
4、递归乘法
int multiply(int A, int B) {
return A*B;
}
5、 两数相除
int divide(int dividend, int divisor) {
if(dividend==-2147483648&&divisor==-1){
return 2147483647;
}
return dividend/divisor;
}
6、Pow(x,n)
double myPow(double x, int n) {
return pow(x,n);
}
7、x的平方根
int mySqrt(int x) {
return sqrt(x);
}
8、最大数值
int maximum(int a, int b) {
return a>b?a:b;
}
9、反转两次的数字
bool isSameAfterReversals(int num) {
return num==0||num%10;
}
二、进阶做法
位运算符:
<<:空位补0,被移除的高位丢弃
>>:被移位的二进制最高位是0,右移后空位补0;最高位是1,最高位补1
&:任何二进制位和0进行&运算,结果都是0;和1进行&运算结果都是原值
|:任何二进制位和0进行|运算,结果都是原值;和1进行|运算结果都是1
~:0的为1,1的为0
^:相同为0,相异为1
不用加减乘除做加法
int add(int a, int b) {
while(b!=0){// 当进位为 0 时跳出
unsigned int c=(unsigned int)(a&b)<<1;// c = 进位
a=a^b;// a = 非进位和
b=c;// b = 进位
}
return a;
}
递归乘法
a*2=a<<1;b/2=b>>1;
int multiply(int A, int B) {
if(B==1){return A;}
if(B==0){return 0;}
if(B&1){
return multiply(A<<1,B>>1)+A;
}
else {
return multiply(A<<1,B>>1);
}
}
两数相除
int divide(int dividend, int divisor) {
int sign=((dividend^divisor)>>31&0x1==1)?-1:1;
long result=0;
long dividend_long=abs((long)dividend);
long divisor_long=abs((long)divisor);
while(dividend_long>=divisor_long){
long i=1;
long tmp=divisor_long;
while(dividend_long>=tmp){
dividend_long-=tmp;
result+=i;
i=i<<1;
tmp=tmp<<1;
}
}
result*=sign;
if(result>INT_MAX||result<INT_MIN){
return INT_MAX;
}
return (int)result;
}