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);
	}
}