剑指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,返回相应的,第一步的结果值。
代码实现如下:
首先这道问题,不允许使用加减乘除,那么我们首先想到的就应该是位运算以及移位运算。
移位运算:
(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面试题47:不用加减乘除做加法 Java实现
- 剑指Offer面试题47(Java版):不用加减乘除做加法
- 剑指Offer解题报告(Java版)——不用加减乘除做加法 47
- [剑指Offer 47] 不用加减乘除做加法(Java)
- 剑指offer-不用加减乘除做加法-java
- 【剑指offer-Java版】47不用加减乘除做加法
- 剑指Offer学习总结-不用加减乘除做加法
- 剑指offer 面试题47 不用加减乘除做加法
- 剑指offer第二版面试题-Java描述-持续更新
- 剑指offer 不用加减乘除做加法
- 【剑指Offer学习】【面试题47:不用加减乘除做加法】
- 【剑指Offer面试编程题】题目1507:不用加减乘除做加法--九度OJ
- 剑指Offer:不用加减乘除做加法(一刷)
- 剑指offer:不用加减乘除做加法
- 剑指offer--(11)左旋转字符串--Java描述
- 剑指offer——不用加减乘除做加法
- 剑指offer--(18)二叉树的下一个结点--Java描述
- 【剑指Offer】面试题47:不用加减乘除做加法
- 【剑指offer】6.5发散思维能力——面试题47:不用加减乘除做加法
- 剑指offer-47:不用加减乘除做加法