博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《剑指 Offer》——48、不用加减乘除做加法
阅读量:2344 次
发布时间:2019-05-10

本文共 611 字,大约阅读时间需要 2 分钟。

1. 本题知识点

位运算

2. 题目描述

写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。

3. 解题思路

设两数字的二进制形式 a,b ,其求和 s = a + b ,a(i) 代表 a 的二进制第 i 位,则分为以下四种情况:

a(i) b(i) 无进位 进位
0 0 0 0
0 1 1 0
1 0 1 0
1 1 0 1

观察发现,无进位和运算就是按位异或结果,进位就是与运算结果但是需要左移一位,因为进位影响下一位的运算。所以 s = a + b,其实就是无进位和 + 进位的结果。

算法设计:

  1. 求无进位和 num1 ^ num2
  2. 求进位 (num1 & num2) << 1
  3. 判断进位是否等于 0
    1. 等于 0,说明此时 a+b 的结果就等于无进位和,直接返回无进位和
    2. 不等于 0,则说明 a+b 的结果等于无进位和 + 进位,递归函数

4. 代码

public class Solution {
public int Add(int num1, int num2) {
int noCarrySum = num1 ^ num2; int carry = (num1 & num2) << 1; return carry == 0 ? noCarrySum : Add(noCarrySum, carry); }}

转载地址:http://edjvb.baihongyu.com/

你可能感兴趣的文章
Redis持久化的两种方式
查看>>
判断一个数组,是否可以分成两个数组之和相等的数组
查看>>
背包问题
查看>>
结构体变量之间的比较和赋值原理
查看>>
C++ const修饰函数、函数参数、函数返回值
查看>>
将单链表的每k个节点之间逆序
查看>>
删除链表中重复的节点——重复节点不保留
查看>>
2018腾讯校招编程题——最重要的城市
查看>>
删除链表中重复的节点——重复节点保留一个
查看>>
实战c++中的vector系列--正确释放vector的内存(clear(), swap(), shrink_to_fit()).md
查看>>
链表排序.md
查看>>
进程与线程的区别与联系、进程与线程的通信方式
查看>>
产生死锁的必要条件及处理方法
查看>>
TCP和UDP的区别
查看>>
事务具有四个特性
查看>>
Hadoop Hdfs 配置
查看>>
tsung集群测试
查看>>
oracle定时删除表空间的数据并释放表空间
查看>>
解决文件提示: /bin/ksh^M: bad interpreter: bad interpreter:No such file or directory
查看>>
ajaxanywhere jsp 使用
查看>>