剑指offer--(13)不要加减乘除做加法--Java描述

本文介绍了一种不使用加减乘除运算实现两个整数相加的方法,通过位运算及移位运算完成加法运算。文章详细解释了二进制下如何通过异或运算实现不考虑进位的相加,并通过位与运算结合左移运算计算进位。

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

写在前面:

    首先这道问题,不允许使用加减乘除,那么我们首先想到的就应该是位运算以及移位运算。

移位运算:

(1)<<左移运算符,eg:num<<1相当于num*2

(2)>>右移运算符,eg:num>>1相当于num/2

(3)>>>无符号位右移运算符,eg:num>>>1,忽略符号位,空位都以0补齐

位运算:

(1)位与:

(2)异或:num1^num2


那么在回顾了这些位运算以及移位运算之后,我们来看一下这道题的大致思路

首先我们来看一下十进制的5+7=12是怎么实现的

    第一步:相加各个位的值,不算进位,得到2.

    第二步:计算进位值,得到10(如果这一步的结果为0,则最后的结果=第一步的结果)

    第三步:重复上述两步,用上述两步得到的结果2+10=12.

然后我们再来看一下二进制的5+7=12是怎么实现的,5的二进制是101,7的二进制是111

    第一步:相加各位的值,不算进位,101+111 得到 010,这一步的操作相当于各位做异或操作,即num1^num2

    第二步:计算进位值,我们只计算第一位和第三位的位与值,也就是=1010, 这一步操作,又相当于101&111,再左移1位,即(101&111)<<1,

    第三步:重复上述两步,用第一步的结果010+第二步的结果1010,由于又有进位,所以还要重复进行第一步,第二步的运算,直到进位为0,返回相应的,第一步的结果值。


代码实现如下:



	public int Add(int num1, int num2) {
		// 循环终止条件:进位为0
		while (num2 != 0) {

			int temp = num1 ^ num2;// 相加不进位
			num2 = (num1 & num2) << 1;
			num1 = temp;
		}
		return num1;
	}







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值