/**
* 使用位运算实现int数据的加法
* (a & b) << 1 => 相加 进位结果
* a ^ b => 相加 不进位结果
* 将上述两个结果相加直到无进位
* @param a
* @param b
* @return
*/
public static int addition(int a, int b){
int carry;
while(b != 0){
carry = (a & b) << 1;
a = a ^ b;
b = carry;
}
return a;
}
/**
* 使用位运算实现int数据的减法
* Java负数存储是以补码形式存储的(补码=反码+1)。所以反码=补码-1.即~n=-n-1=-(n+1)
* 所以a-b可以化简为a+(-b)=a+~b+1
* @param minuend 被减数
* @param meiosis 减数
*/
public static int subtraction(int minuend, int meiosis){
return addition(minuend, addition(~meiosis, 1));
}
/**
* 使用位运算实现int数据的乘法
* 8 * 9
* 1 0 0 0
* * 1 0 0 1
* ----------
* 1 0 0 0
* 0 0 0 0
* 0 0 0 0
* 1 0 0 0
* ---------------
* 1 0 0 1 0 0 0
* = 72
* @param a
* @param b
* @return
*/
public static int multiplication(int a, int b){
int res = 0;
int i = 0;
while (b != 0) {
if((b & 1) == 1){
res = addition(res, a << i);
}
b = b >> 1;
i++;
}
return res;
}
/**
* 使用位运算实现int数据的除法
* 除法的意义就在于:求a可以由多少个b组成。那么由此我们可得除法的实现:求a能减去多少个b,做减法的次数就是除法的商
* @param dividend 被除数
* @param divisor 除数
* @return
*/
public static int division(int dividend, int divisor){
int res = 0;
while(dividend >= divisor){
res++;
dividend = subtraction(dividend, divisor);
}
return res;
}
/**
* 取余数
* @param dividend 被除数
* @param divisor 除数
* @return
*/
public static int remainder(int dividend, int divisor){
while(dividend >= divisor){
dividend = subtraction(dividend, divisor);
}
return dividend;
}