public class AddMinusMultiDivideByBit {
/**
*
* 加法运算
* @param a
* @param b
* @return
*
*/
public static int add(int a, int b) {
int result = 0;
while(b != 0){
result = a ^ b; // 无进位的相加之和, 其结果还差进位后的值
b = (a&b)<<1;//a&b的结果是需要进位的位, 于是将其左移, 与无进位的和再次相加
a = result;
}
return result;
}
// 两个数的减法运算, 例如a-b, 可以看成两个数的加法运算, 例如上例可改成a+(-b)
// 问题转换成了如何求一个数的相反数,方法为:将其取反然后加一.
/**
* 减法运算
* @param a
* @param b
* @return
*/
public static int minus(int a, int b){
return add(a, negNum(b));
}
/**
* 取一个数的相反数
* @param b
* @return
*/
private static int negNum(int b) {
return (~b + 1);
}
/**
* 乘法运算
* 算法思想
*
* a = 3 = 0011
* b = 5 = 0101
* 0011
* * 0101
* ------------
* 0011
* 0000
* 0011
* 0000
* --------------
* 0001111
*
* 其实二进制的乘法运算与十进制的乘法算法一样
* 乘法过程:如果乘数b的第i(i >= 0,i = 0是乘数最右侧的那一位)位为1,
* 那么该位与被乘数a相乘的结果S[i]就是(a << i);
* 然后将这些所有的结果S[i]相加即为最后结果
* @param a
* @param b
* @return
*
*/
public static int multi(int a, int b){
int result = 0;
while(b != 0){
if((b&1) != 0){ // 看最右侧是否为1
result = add(result, a);
}
a = a<<1;
b = b>>1;
}
return result;
}
public static void main(String[] args) {
int a = 3;
int b = 5;
System.out.println(add(a, b));
System.out.println(minus(a, b));
System.out.println(multi(a ,b));
}
}
只用位运算实现整数的加减乘除运算
最新推荐文章于 2021-05-19 13:35:27 发布