当不可以使用加减乘数直接计算两个数字的结果的时候,那么我们可以使用位运算来计算这些结果,具体代码如下:
-
加法:
int add(int num1, int num2){
if (num2 == 0)
return num1;
int sum = num1 ^ num2;
int carry = (num1 & num2) << 1;
return add(sum, carry);
}
int add2(int num1, int num2){
int sum = num1 ^ num2;
int carry = (num1 & num2) << 1;
while (carry != 0){
int a = sum;
int b = carry;
sum = a ^ b;
carry = (a & b) << 1;
}
return sum;
}
-
减法
int sub(int num1, int num2){
int negative = add(~num2, 1);
return add(num1, negative);
}
-
乘法
int multiply(int num1, int num2){
int multiplicand = num1 < 0 ? add(~num1, 1) : num1;
int multiplier = num2 < 0 ? add(~num2, 1) : num2;
int ret = 0;
while (multiplier > 0){
if ((multiplier & 0x1) > 0)
ret = add(ret, multiplicand);
multiplicand <<= 1;
multiplier >>= 1;
}
if ((num1 ^ num2) < 0)
ret = add(~ret, 1);
return ret;
}
-
除法
int divide(int num1, int num2){
int dividend = num1 < 0 ? add(~num1, 1) : num1;
int divisor = num2 < 0 ? add(~num2, 1) : num2;
int quotient = 0;
int remainder = 0;
while (dividend >= divisor){
quotient = add(quotient, 1);
dividend = sub(dividend, divisor);
}
if ((num1 ^ num2) < 0)
quotient = add(~quotient, 1);
remainder = num2 > 0 ? dividend : add(~dividend, 1);
return quotient;
}
int divide2(int num1, int num2){
int dividend = num1 < 0 ? add(~num1, 1) : num1;
int divisor = num2 < 0 ? add(~num2, 1) : num2;
int quotient = 0;
int remainder = 0;
for (int i = sizeof(int)* 8 - 1; i >= 0; i--){
if ((dividend >> i) >= divisor){
quotient = add(quotient, 1 << i);
dividend = sub(dividend, divisor << i);
}
}
if ((num1 ^ num2) < 0)
quotient = add(~quotient, 1);
remainder = num2 > 0 ? dividend : add(~dividend, 1);
return quotient;
}