1、题目表述:
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
2、分析:
位运算知识储备:
算法思路 1、类比 计算两个数,我们先看十进制怎么算的 5 + 7 = 12,分3步走: ①:相加各位的值不算进位得到2 ②:进位的值得到10,如果这一步进位是0,则第一步得到的就是最终的结果 ③:2,10继续重读上面两个步骤得到的结果2,10,相加得12 类比如下: 同样的我们也可以三步走的方式计算: ①:先将5转换成二进制为:101;7转换为二进制为111 ②:相加各位的值不算进位,怎么相加呢,不算进位 101 111 ———— 010 ③: 第三步重复上述两步, 各位相加 010^1010=1000,进位值为100=(010&1010)<<1。 继续重复上述两步:1000^100 = 1100,进位值为0,跳出循环,1100为最终结果。
3、代码实现
public class Solution {
public int Add(int num1,int num2) {
/**
算法思路
1、类比
计算两个数,我们先看十进制怎么算的
5 + 7 = 12,分3步走:
①:相加各位的值不算进位得到2
②:进位的值得到10,如果这一步进位是0,则第一步得到的就是最终的结果
③:2,10继续重读上面两个步骤得到的结果2,10,相加得12
类比如下:
同样的我们也可以三步走的方式计算:
①:先将5转换成二进制为:101;7转换为二进制为111
②:相加各位的值不算进位,怎么相加呢,不算进位
101
111
————
010
③: 第三步重复上述两步, 各位相加 010^1010=1000,进位值为100=(010&1010)<<1。
继续重复上述两步:1000^100 = 1100,进位值为0,跳出循环,1100为最终结果。
*/
//进位数不为0
while(num2 != 0){
//不算进位
int temp = num1^num2;
//计算进位值
num2 = (num1&num2)<<1;
//将进位值给num1
num1 = temp;
}
// 最后进位值是0的时候,num1就是最后所求的值
return num1;
}
}
4、总结
位运算的知识由十进制类比到二进制位运算当进位为0的时候,最后的结果就是第一步得到的结果