int multiply(int a, int b) {
int ans = 0;
while(b != 0) {
if((b & 1) != 0) {
ans = add(ans, a);
}
a <<== 1;
b >>== 1;
}
return ans;
}
class Solution {
public:
// 相反数运算
int neg(int n) {
return add(~n, 1);
}
// 加法运算
int add(int a, int b) {
int ans = a;
while(b != 0) {
ans = a ^ b;
b = (a & b) << 1;
a = ans;
}
return ans;
}
// 减法运算
int minus(int a, int b) {
return add(a, neg(b));
}
// 二分法寻找最高位2的幂
int findIndex(int a, int b) {
// 极端情况
if(a < b) return 0;
if((a >> 30) >= b) return 30;
// 二分法
int l = 0, r = 30;
while(l < r) {
int mid = add(add(l, r), 1) >> 1;
if((a >> mid) >= b) {
l = mid;
if((a >> add(mid,1)) < b) return mid;
} else {
r = minus(mid, 1);
if((a >> minus(mid, 1)) >= b) return minus(mid, 1);
}
}
return l;
}
// 除法运算
int div(int a, int b) {
int x = (a < 0) ? neg(a) : a;
int y = (b < 0) ? neg(b) : b;
int ans = 0;
for(int i = findIndex(x, y); i >= 0; i = minus(i, 1)) {
if((x >> i) >= y) {
ans |= (1 << i);
x = minus(x, y << i);
}
}
return a < 0 ^ b < 0 ? neg(ans) : ans; // 两者同号时为正值,异号为负值
}
// 除法运算的情形分类
int divide(int a, int b) {
if(a == INT_MIN && b == INT_MIN) {
return 1;
}
if(a != INT_MIN && b !=INT_MIN) {
return div(a, b);
}
if(a != INT_MIN && b == INT_MIN) {
return 0;
}
if(a == INT_MIN && b == -1) {
return INT_MAX;
}
a = add(a, (b > 0) ? b : neg(b));
int ans = div(a, b);
int ans_ = (b > 0) ? neg(1) : 1;
return add(ans, ans_);
}
};