您的位置:首页 > Web前端

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

2018-02-24 15:29 302 查看
写在前面:
    首先这道问题,不允许使用加减乘除,那么我们首先想到的就应该是位运算以及移位运算。

移位运算:

(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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  剑指Offer Java