剑指offer(1)

    技术2022-07-10  170

    翻了半天剑指只有几个题有思路。。。一定是我太菜了QAQ

    位运算求和

    不用加减乘除做加法解析代码位运算的好处

    不用加减乘除做加法

    题目: 写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。 分析: 想要用程序实现运算,主要有两种方式,基本的加减乘除和位运算,显然,根据本题要求,应使用位运算来实现。

    解析

    https://www.nowcoder.com/questionTerminal/59ac416b4b944300b617d4f7f111b215?answerType=1&f=discussion

    代码

    由上面的链接我们已经知道 s = a + b 从位运算的角度来看就是无进位和+进位=按位异或/结果+左移一位 算法:

    计算a和b的无进位和,和进位如果进位不为0,则说明a+b的结果等于无进位和+进位,此时,把无进位和作为a,进位作为b,继续计算如果进位等于0, 说明此时a+b的结果就等于无进位和,返回无进位和即可。计算机把减法当加法看,所以解决这一问题就把加减法一起解决了 class Solution { public: int Add(int num1, int num2) { while (num2 != 0) { // 负数左移会在低位补1,所以转化为无符号整数 int c = ((int)(num1 & num2)) << 1; num1 ^= num2; num2 = c; } return num1; } };

    位运算的好处

    之前看帅地的公众号有一篇文章写了,经常使用位运算写程序的基本都是大佬,因为位运算可以让程序的运行效率大幅提高,因为大部分编译器会自动把加减乘除的运算转化成位运算再运行。

    Processed: 0.016, SQL: 9