剑指offer (47) 不用加减乘除做加法

题目:求两个整数之和,要求不得使用 加减乘除四则运算

题解分析:加减乘除都不能用,还要进行各种运算,必然想到 位运算

十进制加法: 5 + 17 = 22

step1. 各位相加,不考虑进位,即舍弃进位,结果为 12 (5 + 7 = 12舍弃进位)

step2. 做进位 (5 + 7 = 12 > 9 有进位) 进位为10

step3. 两步结果相加 12 + 10 = 22

二进制加法:5 + 17 = 22 即 101 + 10001

step1. 各位相加,不考虑进位,即舍弃进位,结果为 10100

step2. 做进位 (1 + 1 有进位) 进位为 二进制的10

step3. 10100 + 10 = 10110 = 22

对于二进制:

各位相加不考虑进位:0 + 0 = 0 ;1 + 1 = 0;1 + 0 = 1; 0 + 1 = 1 异或操作搞定

做进位:只有1+1才有进位,即 1&1 与操作搞定

int Add(int num1, int num2) {
    int sum = 0;
    int carry = 0;

    do {
        sum = num1 ^ num2;
        carry = (num1 & num2) << 1;

        num1 = sum;
        num2 = carry;
    } while (num2 != 0);
    return num1;
}

剑指offer (47) 不用加减乘除做加法

时间: 2024-12-21 16:57:01

剑指offer (47) 不用加减乘除做加法的相关文章

【剑指offer】不用加减乘除做加法

转载请注明出处:http://blog.csdn.net/ns_code/article/details/27966641 题目描述: 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 输入: 输入可能包含多个测试样例.对于每个测试案例,输入为两个整数m和n(1<=m,n<=1000000). 输出: 对应每个测试案例,输出m+n的值. 样例输入: 3 4 7 9 样例输出: 7 16 思路: 1.先将各bit位相加,不计进位,这一步可以用m^n实现 2.加上进位

剑指Offer之不用加减乘除做加法

题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 解题思路 求两个数的和在不能使用加减乘除的条件下,可以使用位运算.位运算是针对二进制的,我们以5和17这两个数字为例.5的二进制是101,17的二进制是10001.我们把计算分成三步:第一步各位相加但不计进位,得到的结果是10100(最后一位两个数都是1,相加的结果是二进制的10.这一步不计进位,因此结果仍是0):第二步记下进位.在这个例子中只在最后一位相加时产生一个进位,结果是二进制的10:第三步是把前两

《剑指offer》不用加减乘除做加法

[ 声明:版权所有,转载请标明出处,请勿用于商业用途.  联系信箱:[email protected]] 题目链接:http://www.nowcoder.com/practice/59ac416b4b944300b617d4f7f111b215?rp=3&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 思路 题目

[剑指Offer] 48.不用加减乘除做加法

题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. [思路] 首先看十进制是如何做的: 5+7=12,三步走第一步:相加各位的值,不算进位,得到2.第二步:计算进位值,得到10. 如果这一步的进位值为0,那么第一步得到的值就是最终结果.第三步:重复上述两步,只是相加的值变成上述两步的得到的结果2和10,得到12. 同样我们可以用三步走的方式计算二进制值相加: 5-101,7-111 第一步:相加各位的值,不算进位,得到010,二进制每位相加就相当于各位做异或

剑指offer42:不用加减乘除做加法

分析: (1)十进制加法分三步:(以5+17=22为例) 1. 只做各位相加不进位,此时相加结果为12(个位数5和7相加不进位是2,十位数0和1相加结果是1): 2. 做进位,5+7中有进位,进位的值是10: 3. 将前面两个结果相加,12+10=22 (2)这三步同样适用于二进制位运算 1.不考虑进位对每一位相加.0加0.1加1结果都是0,0加1.1加0结果都是1.这和异或运算一样: 2.考虑进位,0加0.0加1.1加0都不产生进位,只有1加1向前产生一个进位.可看成是先做位与运算,然后向左移

剑指offer-47:不用加减乘除做加法

参考:https://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html <原码,反码,补码 详解> 题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 解题思路 不能使用加减乘除,我的第一反应就是使用 位运算 和 二进制字符串判断 .二进制字符串从末尾到首位一位位判断,也是能得出结果的,但是代码太长,判断多种情况,太麻烦了.这并不是一个聪明的方法,舍弃了. 另一种方法是位运算.一

47不用加减乘除做加法

题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 思路:感觉还是对位运算不太熟悉. ^异或是不进位加法,相同的为0,不同的为1: &与运算是都为1就为1,有一个是0就全为0: |或运算只要有一个是1就是1. 例子:5 + 7: 这题首先1)计算不进位的加法,5 + 7 = 02: 2)计算进位.5 +7 = 10: 3)将1和2相加,10 + 2 = 12: 第一步就是异或操作,第二步首先使用&操作得到都为1的那些位,然后一定记得左移一位才是得到进位

剑指Offer面试题47(Java版):不用加减乘除做加法

题目:写一个函数,求两个整数之和,要求在函数体内不得适用+,-,* ,./  四则运算符号 面试的时候被问道这个问题,首先我们分析人们是如何进行十进制的加法的,比如是如何得出5+17=22的结果的,实际上,我们可以分三步进行:第一步只做各位相加不进位,此时相加的结果是12,第二步做进位,5+7中有进位,进位的值为10:第三步,把前面的两个结果加起来12+10的结果是22,刚好5+17=22 我们一直在想,求两个树之和四则运算都不能用,还能用什么?对数字做运算,除了四则运算之外,也就只剩下位运算了

剑指Offer对答如流系列 - 不用加减乘除做加法

面试题65:不用加减乘除做加法 题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.×.÷四则运算符号. 问题分析 我们之前详细探讨了位运算 剑指Offer对答如流系列 - 二进制中 1 的个数,已经非常非常详细了. 这道题仅仅是让做加法,我们除此之外还是做了乘除与减法. 记不清的朋友可以回头看看. 这里象征性地做一次解答吧 问题解答 public int add(int num1,int num2) { while(num2!=0){ int sum=num1^num2; in