public class Test73 {
// 使用位运算实现两个整数的加法
public static int add(int a, int b){
int ans = a; // 初始化结果为a
while(b != 0) { // 当b不为0时,继续执行循环
ans = a^b; // 异或操作,得到不考虑进位的结果
b = (a & b) << 1; // 与操作后左移一位,得到进位值
a = ans; // 更新a为不考虑进位的结果
}
return ans; // 返回最终结果
}
// 实现两个整数的减法,通过调用add方法实现
public static int minus(int a, int b) {
return add(a, neg(b)); // 将b取反后相加,相当于a减去b
}
// 实现一个整数的取反操作
public static int neg(int n){
return add(~n , 1); // 对n进行按位取反,然后加1得到其相反数
}
// 使用位运算实现两个整数的乘法
public static int multiply(int a, int b) {
int ans = 0; // 初始化结果为0
while(b != 0) { // 当b不为0时,继续执行循环
if((b & 1) != 0) { // 如果b是奇数,则将a累加到结果中
ans = add(ans, a);
}
a <<= 1; // a左移一位,相当于乘以2
b >>>= 1; // b无符号右移一位,相当于除以2
}
return ans; // 返回最终结果
}
// 定义整数最小值常量
public static int MIN = Integer.MIN_VALUE;
// 实现两个整数的除法
public static int divide(int a, int b) {
if (a == MIN && b == MIN) {
// a和b都是整数最小,返回1作为结果
return 1;
}
if (a != MIN && b != MIN) {
// a和b都不是整数最小,那么正常去除
return div(a, b);
}
if (b == MIN) {
// a不是整数最小,b是整数最小,返回0作为结果
return 0;
}
// a是整数最小,b是-1,返回整数最大,因为题目里明确这么说了
if (b == neg(1)) {
return Integer.MAX_VALUE;
}
// a是整数最小,b不是整数最小,b也不是-1
a = add(a, b > 0 ? b : neg(b)); // 先将a加上b的绝对值
int ans = div(a, b); // 计算新的a除以b的结果
int offset = b > 0 ? neg(1) : 1; // 根据b的正负确定偏移量
return add(ans, offset); // 返回最终结果加上偏移量
}
// 必须保证a和b都不是整数最小值,返回a除以b的结果
public static int div(int a, int b) {
int x = a < 0 ? neg(a) : a; // 取a的绝对值
int y = b < 0 ? neg(b) : b; // 取b的绝对值
int ans = 0; // 初始化结果为0
for (int i = 30; i >= 0; i = minus(i, 1)) { // 从高位开始遍历
if ((x >> i) >= y) { // 如果当前位大于等于y
ans |= (1 << i); // 将对应位设为1
x = minus(x, y << i); // 减去y左移i位的值
}
}
return a < 0 ^ b < 0 ? neg(ans) : ans; // 根据a和b的正负情况决定是否取反
}
}