Problem_Arithmetic Operations based Bit Manipulation - xwu36/LeetCode GitHub Wiki
Code:
public class BitOperations {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(add(7, 7));
System.out.println(minus(7, 5));
System.out.println(multiply2(-7, -5));
System.out.println(divide2(-20, 11));
}
public static int add(int a, int b){
return b == 0 ? a : add(a ^ b, (a & b) << 1);
}
public static int minus(int a, int b){
return add(a, -b);
}
public static int negative(int a){
return add(~a, 1);
}
public static int getSign(int a){
return (a >> 31);
}
public static int bePositive(int a){
return getSign(a) == 0 ? a : negative(a);
}
public static int multiply1(int a, int b){
boolean flag = (getSign(a) == getSign(b));
a = bePositive(a);
b = bePositive(b);
int ans = 0;
while(b > 0){
ans = add(ans, a);
b = minus(b, 1);
}
return flag ? ans : negative(ans);
}
public static int multiply2(int a, int b){
boolean flag = (getSign(a) == getSign(b));
a = bePositive(a);
b = bePositive(b);
int ans = 0;
while(b > 0){
if((b & 1) == 1)
ans = add(ans, a);
a <<= 1;
b >>= 1;
}
return flag ? ans : negative(ans);
}
public static int divide1(int a, int b){
if(b == 0) return 0;
boolean flag = (getSign(a) == getSign(b));
a = bePositive(a);
b = bePositive(b);
int ans = 0;
a = minus(a, b);
while(a >= 0){
ans = add(ans, 1);
a = minus(a, b);
}
return flag ? ans : negative(ans);
}
public static int divide2(int a, int b){
if(b == 0) return 0;
boolean flag = (getSign(a) == getSign(b));
a = bePositive(a);
b = bePositive(b);
int ans = 0;
int i = 31;
while(i >= 0){
if((a >> i) >= b){
ans = add(ans, 1 << i);
a = minus(a, (b << i));
}
i = minus(i, 1);
}
return flag ? ans : negative(ans);
}
}