美文网首页
剑指offer | 不用加减乘除做加法

剑指offer | 不用加减乘除做加法

作者: 柴柴总 | 来源:发表于2020-07-16 22:38 被阅读0次

    背景知识

    计算机中数字用二进制方式存储,有符号数有三种表示方法,原码,补码,反码。三种表示均在数值前面加了一位符号位(0为正,1为负)
    原码:例如,我们用8位二进制表示一个数,+11的原码为00001011,-11的原码就是10001011。原码不利于运算,例如1+(-1)=0,而在二进制中00000001+10000001=10000010,换算成十进制为-2,显然出错了。于是就引入了补码表示。
    反码:反码跟原码是正数时,一样;负数时,反码就是原码符号位除外,其他位按位取反。
    补码:在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。
    正数的补码与原码相同
    负数的补码,将其原码除符号位外的所有位取反(0变1,1变0,符号位为1不变)后加1
    例:求-5的补码。(8位二进制)
    -5对应正数5(00000101)→所有位取反(11111010)→加1(11111011)
    所以-5的补码是11111011。

    题目

    写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
    除了四则运算符还有位运算,此题就通过位运算来解
    无进位和运算就是按位异或结果,进位是与预算结构,进位影响下一位运算,所以要左移一位



    算法步骤:每一次循环算无进位和还有进位,将二者相加直到进位为0

    class Solution {
    public:
        int Add(int num1, int num2)
        {
            int result1,result2;
            while(num2)
            {
                result1 = num1 ^ num2;
                result2 = (num1 & num2) << 1;
                num1 = result1;
                num2 = result2;
                
            }
            return num1;
        }
    };
    

    相关文章

      网友评论

          本文标题:剑指offer | 不用加减乘除做加法

          本文链接:https://www.haomeiwen.com/subject/mgmmhktx.html