剑指offer-47:不用加减乘除做加法
参考:https://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html 《原码,反码,补码 详解》
题目描述
解题思路
不能使用加减乘除,我的第一反应就是使用 位运算 和 二进制字符串判断 。二进制字符串从末尾到首位一位位判断,也是能得出结果的,但是代码太长,判断多种情况,太麻烦了。这并不是一个聪明的方法,舍弃了。
另一种方法是位运算。一个数在计算机中会先转成二进制,正数使用原码,负数使用补码,然后进行加减操作。例如计算机中有两个正整数 a 和 b,a + b 则是 a 的原码加上 b 的原码;a - b = a + (-b),即 a 的原码加上 (-b) 的补码。具体的计算过程,请看第一行的参考链接,讲的很详细。在Java中,负数的二进制也是使用补码表示的,所以,只需要考虑如何完成加法便能解决问题。
首先看两个例子,二进制是如何进行加法的。从两个例子中可以发现,在没有进位的情况下,两个二进制相加,实际上进行了异或操作。在有进位的情况下,先进行异或,得到的是不包含进位的结果 (A)。然后两个二进制再进行位与,得到只带进位的结果 (B)。然后重复以上两个操作,将 (A) 与左移一位的进位 (B) 异或,得到结果 (C);将 (A) 与左移一位的进位 (B) 位与,得到结果 (D);一直到最后位与的结果为0,即没有进位,终止循环。那么在最后 位与 之前的一步 异或 就是最终的结果。
例子1: 10 + 5 = 15
1 0 1 0
+ 0 1 0 1
--------------
1 1 1 1
例子2: 9 + 5 = 14 1 0 0 1 1 0 0 1 1 0 0 1 1 1 0 0 1 1 0 0+ 0 1 0 1 异或 0 1 0 1 位与 0 1 0 1 异或 0 0 0 1 0 (左移一位) 位与 0 0 0 1 0-------------- --------------- -------------- ----------------- ------------------- 1 1 1 0 (A) 1 1 0 0 (B) 0 0 0 1 (C) 1 1 1 0 (D) 0 0 0 0
代码如下:
public int Add(int num1,int num2) {
while (num2 != 0) {
int tmp = num1 ^ num2;
int carry = (num1 & num2) << 1;
num1 = tmp;
num2 = carry;
}
return num1;
}
剑指offer-47:不用加减乘除做加法的更多相关文章
- 剑指offer 65. 不用加减乘除做加法(Leetcode 371. Sum of Two Integers)
剑指offer 65. 不用加减乘除做加法(Leetcode 371. Sum of Two Integers) https://leetcode.com/problems/sum-of-two-in ...
- 剑指 Offer 65. 不用加减乘除做加法 + 位运算
剑指 Offer 65. 不用加减乘除做加法 Offer_65 题目描述 题解分析 java代码 package com.walegarrett.offer; /** * @Author WaleGa ...
- 【剑指Offer】不用加减乘除做加法 解题报告(Java)
[剑指Offer]不用加减乘除做加法 解题报告(Java) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews 题 ...
- 【Java】 剑指offer(65) 不用加减乘除做加法
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.×. ...
- Go语言实现:【剑指offer】不用加减乘除做加法
该题目来源于牛客网<剑指offer>专题. 第一步:相加各位的值,不算进位,得到010,二进制每位相加就相当于各位做异或操作,101^111. 第二步:计算进位值,得到1010,相当于各位 ...
- 【剑指offer】不用加减乘除做加法,C++实现
原创博文,转载请注明出处! # 题目 # 思路 第一步:不考虑进位对每一位相加(异或操作) 第二步:考虑进位(位与运算+左移) 第三步:第一步和第二步相加(重复执行前两步) # 代码 #include ...
- 剑指Offer 48. 不用加减乘除做加法 (其他)
题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 题目地址 https://www.nowcoder.com/practice/59ac416b4b944300 ...
- [剑指Offer] 48.不用加减乘除做加法
题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. [思路] 首先看十进制是如何做的: 5+7=12,三步走第一步:相加各位的值,不算进位,得到2.第二步:计算进 ...
- 【剑指offer】不用加减乘除做加法
转载请注明出处:http://blog.csdn.net/ns_code/article/details/27966641 题目描写叙述: 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.* ...
- 剑指offer——75不用加减乘除做加法
题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 题解: 使用位运算 class Solution { public: int Add(int num1 ...
随机推荐
- 实战webpack系列03
03.Webpack的强大功能 一.生成Source Maps(使调试更容易) 通过简单的配置,webpack就可以在打包时为我们生成的source maps,这为我们提供了一种对应编译文件和源文件的 ...
- nginx集群架构
Linux集群从功能分类 高可用集群,高可用集群通常为俩台服务器,一台工作,另一台冗余,当提供服务器的服务器宕机时候,冗余服务器将接替宕机的服务器继续提供服务.实现高可用的集群开源软件有Heatbea ...
- java String比较,“==”和“equal”区别
public static void main(String[] args){ String str1 = new String("str"); String str2 = new ...
- jQuery基于json与cookie实现购物车的方法
/** * 添加商品及数量到购物车cookie中,返回当前商品在cookie中的总数 */ function AddToShoppingCar(id, num, type) { var _num = ...
- JavaScript新手经常遇到的问题(二)
1.Form表单只提交数据而不进行页面跳转的方法 <script type="text/javascript" src="js/jquery/jquery-1.8. ...
- 小熊派IoT开发板系列教程正式发布——免费学习
[摘要] 小熊派开源社区针对小熊派IoT开发板首次规划了小熊派未来的系列教程.从基础到进阶的设计,可适应具有不同基础的开发者,通过该系列教程的学习,开发者能够轻松掌握IoT产品的开发.该系列教程包括单 ...
- 华为担纲建设基础软硬件国家新一代AI开放创新平台
[摘要] 全栈全场景AI能力爆发! [上海,2019年8月29日] 凭借领先的全栈全场景AI能力华为入选国家新一代人工智能开放创新平台 8月29日,科技部在2019世界人工智能大会宣布,将依托华为建设 ...
- CentOS下永久修改主机名
永久修改主机名 [root@centos7 ~]# vim /etc/hostname 打开之后将原来的名字改成你想换的名字 [root@centos7 ~]# cat /etc/hostname 查 ...
- Mybatis_多表关联查询_resultMap_集合对象_N+1方式实现
mapper 层 提供 ClazzMapper 和 StudentMapper, ClazzMapper 查询所有班级信息, StudentMapper 根据班级编号查询学生信息. 在 ClazzMa ...
- Java多态之向上转型
目录 Java多态之向上转型 多态的优点 向上转型 概念 向上转型好在哪 Java多态之向上转型 多态性是面向对象的第三大特征. 多态的优点 改善代码的组织结构和可读性. 能够创建可扩展的程序.(随时 ...