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

题目描述

写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。

因为需要求两个数的和但是又不能使用加减乘除运算符号,自然我就想到了位运算。位运算主要有两种一种是逻辑运算符另一种是移位运算符。逻辑运算符主要有:&按位与、|按位或、~按位取反,^异或。移位运算符有>>右移一位、<<左移一位。

&按位与:两个数对应位都为1则为1,有0则0。

|按位或:两个数对应位都为0则为0,有1则1.

~按位取反:操作数字当前位置为1变成0,为 0变成1.

^异或:两个数对应位相同为0,不同为1。

假设这是我们的两个数字需要相加,那我们只需要将两个数字按位|,就可以得到

这就得到了我们想要的加法效果,但是如果说两个数相同位置有1

这时候数字是有进位的,那我们只需要将两个数字中的任意一个数字左移一位,就可以得到我们想要的数字,但是如果说我们两个数字中的数字是

这时候我们还可以通过移位来实现吗?硬要说可以,那就是移动上边小的数字两位,但是我们在程序中传进来的数字是不知道数字中每个位的情况是什么样的,各种各样的情况都是存在的,所以不能简单的移位来解决问题。

首先我们还是通过我们的异或来将两个数字位相加,这里我们拿两数字举例子假设我们相加的两个数字分别是12和9。

这里我们只看两个数字的后四位有效位就行,当我们拿到这两个数字的二进制位的时候,我们先进行我们刚刚说的第一步,也就是说让两个数字异或,假如我们两个数字的二进制是0100和1001.那我们直接异或完得到的数字就是我们两个数字相加了,但是就是怕出现我上边说到的情况,如果有进位应该怎么办,这时候我们就要求一下这两个数字相异或有没有进位呢?什么情况下有进位?两个数字相同位置的比特位都有1那这次相加就存在了进位,怎么判断两个数字是不是存在同一个位置是不是都有1呢?那就用到了我们的按位&,我们上边说了按位与都为1得出来的数字才为1.继续拿我们的12和9举例子。

进行完异或之后1100^1001=0101,这时候我们通过按位与1100&1001=1000,只要按位与得出来的数字不是0那就说明这两个数字存在至少一个相同位置都有1.那这时候我们就需要进位,进位应该往比他大的那一位进,那就是他的前一位,所以让我们当前得到的这个数字1000向左移一位,无论是1000还是1001还是1101都是所有相同位置有1的都需要向前进一位,整体需要左移一位。我们1000左移之后是10000,这时候我们就需要将进的这一位加到我们刚刚得到的数字上,因为异或的时候我们相同位置得了0,我们就需要将他的前一位变成1.也就是拿我们的10000和0101继续进行异或,让他们两个去加,然后继续求他们两个相加有没有进位,所以这就成了一个循环,那这个循环什么时候结束呢?当我们两个数字相加也就是进行异或之后,去求两个数的进位也就是按位与的时候的得出来的数是0,也就是两个数字不存在某一个相同位置都为1,那就可以停止了。

那将我们上边的思想变成程序之后就是一个while循环来是想了。

class Solution {

public:

int Add(int num1, int num2)

{

while (num2!=0)

{

int sum = num1^num2;//先将两个数字进行异或

num2 = num1&num2;//判断两个数字有没有进位

if (num2)

num2=num2 << 1;//如果num2不是0那就说明有进位,那就需要让num2左移,也就是向前走一位。

num1 = sum;//如果有进位的话还要进入循环让num1^num2

//这时候本次循环结束,去下次循环判断num2是不是0,是的话就不再进入循环了,不是0那就继续让刚刚异或得到的结果num1和按位与求进位得到的结果num2进行异或

}

return num1;//是0那就说明刚刚异或的没有问题不存在进位问题,这接返回异或的结构

}

};

在上边写

if (num2)

num2=num2 << 1;//如果num2不是0那就说明有进位,那就需要让num2左移,也就是向前走一位。

 

一定要注意不要写成

if (num2)

num2 << 1;

这时候的num2是没有变化的。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值