Java之《剑指Offer》:求两个整数之和,要求在函数体内不得使用+、-、*、四则运算符号

    科技2023-10-14  98

    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的时候,最后的结果就是第一步得到的结果
    Processed: 0.009, SQL: 8