首页 > 其他 > 详细

面试题65. 不用加减乘除做加法

时间:2020-05-10 00:29:41      阅读:68      评论:0      收藏:0      [点我收藏+]

题目:

技术分享图片

 

 

解法:

/*
* 位运算
*
* 因为不能使用加减乘除四则运算,所以只能想到使用二进制的位运算实现相加操作。
* 二进制位运算中,异或操作: 1^1=0 0^0=0 1^0=1 0^1=1,可以模拟无进位的加操作;
* 与操作:1&1=1 0&1=0 1&0=0 0&0=0,可以模拟进位的情况,再将与后的值左移一位即等于进位值。
*
* 普通的十进制数相加过程是:
* 1) 各位相加,无进位和 2) 计算进位值 3) 无进位和加上进位值
*
* 使用位运算的二进制数的相加过程相同:
* 1) 两个二进制数各位异或,得到无进位的和 2) 二进制数各位与再左移,计算进位 3) 无进位和与进位异或
* 重复上面操作,直到不再有进位,即进位为0。
*
* 相关问题:
* 不使用新的变量,交换两个变量的值。比如有两个变量a、b,希望交换它们的值。有两种不同的操作:
* 1. 基于加减法 -- a = a + b; b = a - b; a = a - b;
* 2. 基于位运算 -- a = a ^ b; b = a ^ b; a = a ^ b;
* */

 1 class Solution {
 2 public:
 3     int add(int a, int b) 
 4     {
 5         // 无进位和、进位值
 6         int sum, carry;
 7         while (b != 0) 
 8         {
 9             // 异或操作得无进位和
10             sum = a ^ b;
11             // 与操作后移位得进位值
12             carry = ((unsigned int) (a & b) << 1);
13 
14             // 循环,直到进位为0
15             a = sum;
16             b = carry;
17         }
18 
19         return a;
20     }
21 
22 };

 

面试题65. 不用加减乘除做加法

原文:https://www.cnblogs.com/ocpc/p/12860516.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!