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

本文介绍了一种不使用+、-、*、/等基本算术运算符,仅通过位运算实现两个整数相加的方法。文章详细解释了利用位运算中的按位与(&)和按位异或(^)来模拟加法的过程,并给出了具体的C语言实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

剑指offer面试题47:不使用+、-、*、/ 来计算出两个数的和

题目描述:




看到这个题很多人第一时间肯定是懵逼了!!!

不使用+ - *  / 四则运算那还要怎么来计算呢???  面试官会不会在玩我呢???

你要是这么想的话,被面试官知道的话,那么你就别想拿到offer了。。。。


面试的时候,碰到这种题目不要害怕,没有四则运算的我们不是还有位运算的嘛!!!

这个题面试官明显是考你位运算的使用,还有对于数字的敏感度。。。

位运算,就是对于两个数,进行的是二进制操作 ,一个数它不是1 就是0;

而这个题目 ,我们需要的结果的到两个数的和》》》。

1+1 = 0;(加上进位) ;0+1  =1;1+0 = 1 ;0+0=0;;;;

看到这个东西之后我们看的出来 ,这些结果   和   +  运算的结果  与    ^运算的结果是相同的


要是说,到了此处还有问题的话,那就是进位的问题了。

我们都知道,当两个 1相加的话,会产生进位的  (向高位进一位),那么我们只要单独记录下这种情况就可以了,

那要怎么得到这种情况呢???

对比发现,只要使用  & 运算 ,,,当两数的这个位数都是1的情况下,才产生进位。

那么只要将两数   & 后的结果,加到  ^后的结果,那么就会得到正确的结果。。

代码的实现

//面试题:47 不使用四则运算的话 ,来得到两个数 的整数和



//使用的是 位运算

int GetAddTwo(int num1,int num2)
{
	//得到两个数的进位值
	int carry = (num1 & num2)<<1;
	//两数相加的值 (不算上进位)
	int add  = num1^ num2;
	//当什么时候进位为 0,,,表示的就是add就是 相加后的最终值
	while(carry)
	{
		num1 = carry;
		num2 = add;
		carry = (num1 & num2)<<1;
		add  = num1 ^ num2;
	}
	return  add;
}


















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值