class Solution {
public:
static const int MIN =INT_MIN;
int divide(int a, int b) {
if(a==MIN&&b==MIN)
{
return 1;
}
if(a!=MIN&&b!=MIN)
{
return div(a,b);
}
if(b==MIN)
{
return 0;
}
if(b==neg(1))
{
return INT_MAX;
}
a=add(a,b<0?neg(b):b);
int ans=div(a,b);
int offset=b<0?1:-1;
return add(ans,offset);
}
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 = 30; 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 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));
}
int neg(int n)
{
return add(~n,1);
}
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;
}
};