题目描述
题目很简单,只是求出两个整数的和即可,但也存在特别的地方。就是让你不用普通的十进制计算问题,换成位运算的形式来计算。
解题思路
1、两个数的与运算得出两数相加需要进位的值
2、两个数的异或运算求出两数不进位加法的值
3、如此循环,当b的值为0时,运算结束
实现代码
注意:在该代码里,同时实现了减法、乘法和除法,相关思路根据代码注释。
package _test;
import java.util.Random;
public class Test001 {
public static void main(String[] args) {
/**
* 位运算之加减乘除
*/
int a = new Random().nextInt(100);//被除数远大于除数
int b = new Random().nextInt(10) + 1;//避免除数为零
System.out.println("随机数:" + a + " " + b);
System.out.println("加法:" + add(a, b));
System.out.println("减法:" + sub(a, b));
System.out.println("乘法:" + multi(a, b));
System.out.println("除法:" + div(a, b));
}
/**
* 位运算实现加法运算:
* 1、异或运算得出不进位加法的值
* 2、与运算得出加法运算中需要进位的值,通过<<1可复位
* @param a
* @param b
* @return
*/
public static int add(int a, int b){
if (b == 0){
return a;
}
//运算中需要进位的值
int carry = (a & b) << 1;
//不进位加法的值
a = a ^ b;
return add(a, carry);
}
/**
* 位运算实现减法运算
* @param a
* @param b
* @return
*/
public static int sub(int a, int b){
//计算原理:a - b = a + (~b + 1)
b = ~ b + 1;
return add(a, b);
}
/**
* 位运算实现乘法运算
* @param a
* @param b
* @return
*/
public static int multi(int a, int b){
int index = 0;//确定a需要移动的位数
int result = 0;//声明返回的变量
while (b != 0){
//判断b的最低位是否为1
if ((b & 1) == 1){
result = result + (a << index);
}
//将b进行变化
b = b >> 1;
//记录当前需要移动的位数
index++;
}
return result;
}
/**
* 位运算实现除法运算
* @param a
* @param b
* @return
*/
public static int div(int a, int b){
//当被除数小于除数即停止
if (a < b){
return 0;
}
//利用除法转换为减法的思想:存在一个除数即可为商加1
int res = div(sub(a, b), b) + 1;
return res;
}
}