1、加法
// 加法运算
public static int add(int a, int b) {
/*
实现原理:
不考虑进位结果: a ^ b
只考虑进位结果: (a & b) << 1
然后上述两个结果继续运算,直到进位为 0
*/
int x = a;
int y = b;
while (y != 0) {
x = a ^ b;
y = (a & b) << 1;
a = x;
b = y;
}
return a;
}
// 加法运算的递归实现
public static int addRecursion(int a, int b) {
if (((a & b) << 1) == 0)
return a ^ b;
else
return addRecursion(a ^ b, ((a & b) << 1));
}
2、减法
/*
减法:计算机中,减法实际上是减数加上被减数的补码 (补码 = 反码 + 1)
a - b = a + (~b + 1) = a + ~b + 1
*/
public static int subtraction(int a, int b) {
return add(a, ~b + 1);
}
3、乘法
/*
二进制乘法原理:
从乘数低位到高位,遇到 1 并且这个 1 在乘数的右起第 i (i 从 0 开始)位,
那么就把 被乘数 左移 i 位得到 temp_i。直到乘数中的 1 遍历完后,把上面被乘数
左移得到的 temp_i 相加起来得到乘法结果
*/
public static int multiplication(int a, int b) {
int i = 0;
int res = 0;
// 乘数不为 0
while (b != 0) {
// 处理当前位
// 如果当前位是 1
if ((b & 1) == 1) {
res += (a << i);
b = b >> 1;
i++;
} else {
// 当前位是 0
b = b >> 1;
i++;
}
}
return res;
}
4、除法
/*
除法可以换成 减法 来实现
*/
public static int division(int a, int b) {
int res;
if (a < b) {
return 0;
} else {
res = division(subtraction(a, b), b) + 1;
}
return res;
}