我是靠谱客的博主 自觉草丛,最近开发中收集的这篇文章主要介绍剑指Offer65.不用加减乘除做加法,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

  • 题目:剑指Offer65.不用加减乘除做加法
    求两个int类型数a+b;
    结果不会溢出 32 位整数

  • 思路:
    这种限制±*/操作符,或者限制if,else,for,while语句的题,可选的方式往往有:利用&&或||的短路效应,位运算

1.位运算:
将求a+b转换为求进位部分+不进位部分;
进位部分:要找到a和b的对应二进制位均为1的地方(用&),然后<<1,就相当于进位操作;
不进位部分:a ^ b本身就被称为不进位加法;
用a和b分别代表进位部分和不进位部分,不断循环,直至其中一个为0,则另一个就是a+b;
之所以选b作为循环条件,因为b一定最终变为0:假如b的二进制末尾有k个0,则b = (a & b) << 1至少有k+1个0,因此最多循环2次b一定为0;而a要想为0,则必须a==b,这种情况不是每次都能出现;

class Solution {
public:
int add(int a, int b) {
while (b) {
//这里转成unsigned, 因为负数左移补1,而我们想让它补0
int c = unsigned(a & b) << 1;//进位部分,即对应二进制位是1 1时,使用&找到1 1 的位,之后 << 1将其加到前一位上
a ^= b;//不进位部分:对应二进制位是1 0得1,0 1得1,0 0得0,1 1得0,因此用 ^
b = c;//相当于将求a+b转换为求进位部分+不进位部分,但转换之后相加依然可能需要进位,因此循环至其中一部分为0停止
}
return a;
}
};

最后

以上就是自觉草丛为你收集整理的剑指Offer65.不用加减乘除做加法的全部内容,希望文章能够帮你解决剑指Offer65.不用加减乘除做加法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(148)

评论列表共有 0 条评论

立即
投稿
返回
顶部