参考: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:不用加减乘除做加法的更多相关文章

  1. 剑指offer 65. 不用加减乘除做加法(Leetcode 371. Sum of Two Integers)

    剑指offer 65. 不用加减乘除做加法(Leetcode 371. Sum of Two Integers) https://leetcode.com/problems/sum-of-two-in ...

  2. 剑指 Offer 65. 不用加减乘除做加法 + 位运算

    剑指 Offer 65. 不用加减乘除做加法 Offer_65 题目描述 题解分析 java代码 package com.walegarrett.offer; /** * @Author WaleGa ...

  3. 【剑指Offer】不用加减乘除做加法 解题报告(Java)

    [剑指Offer]不用加减乘除做加法 解题报告(Java) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews 题 ...

  4. 【Java】 剑指offer(65) 不用加减乘除做加法

      本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.×. ...

  5. Go语言实现:【剑指offer】不用加减乘除做加法

    该题目来源于牛客网<剑指offer>专题. 第一步:相加各位的值,不算进位,得到010,二进制每位相加就相当于各位做异或操作,101^111. 第二步:计算进位值,得到1010,相当于各位 ...

  6. 【剑指offer】不用加减乘除做加法,C++实现

    原创博文,转载请注明出处! # 题目 # 思路 第一步:不考虑进位对每一位相加(异或操作) 第二步:考虑进位(位与运算+左移) 第三步:第一步和第二步相加(重复执行前两步) # 代码 #include ...

  7. 剑指Offer 48. 不用加减乘除做加法 (其他)

    题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 题目地址 https://www.nowcoder.com/practice/59ac416b4b944300 ...

  8. [剑指Offer] 48.不用加减乘除做加法

    题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. [思路] 首先看十进制是如何做的: 5+7=12,三步走第一步:相加各位的值,不算进位,得到2.第二步:计算进 ...

  9. 【剑指offer】不用加减乘除做加法

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/27966641 题目描写叙述: 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.* ...

  10. 剑指offer——75不用加减乘除做加法

    题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号.   题解: 使用位运算   class Solution { public: int Add(int num1 ...

随机推荐

  1. Gzip,BZip2,Lzo,Snappy总结

    gzip,bzip2,lzo,snappy是hadoop中比较常见的文件压缩格式,可以节省很多硬盘存储,以下是Gzip , BZip2 , Lzo Snappy 四种方式的优缺点 和使用场景 Gzip ...

  2. 构建调试Linux内核网络代码的环境MenuOS系统

    构建MenuOS系统 1.将指定文件拷贝到本地: git clone https://github.com/mengning/linuxnet.git 此过程可能需要输入github账号和密码. 2. ...

  3. SimpleXML使用详解

    SimpleXML使用详解 介绍 SimpleXML提供了一种简单,直观的方法来处理XML.它只有一个单一类型的类,三个函数和六个方法. 使用SimpleXML SimpleXMLElement 类是 ...

  4. Django杂录

    Django杂录 因为是概括性的讲解,每一个方面没有具体到点,所以这篇是杂录 HHTP协议 超文本传输协议 四大特性 基于TCP/IP之上作用于应用层 基于socket请求响应 无状态 无连接 数据格 ...

  5. 简单实现TodoList

    Todolist实例 储备知识js的splice的用法 实例逻辑 1 在data里面做一个存一条条留言的列表,往里面添加或者删除留言内容. 2 做一个变量和input双向绑定,然后做一个点击事件把这个 ...

  6. redis - redis数据结构与API

    通用命令 keys:遍历所有的key[keys一般不再生产环境使用],时间复杂度O(n) keys * keys he* keys he[h-l]* keys ph? dbsize:计算key的总数, ...

  7. 使用Feign访问接口

     添加主要依赖 使用Feign访问接口的配置,如果服务不在Eureka上,可以不加Eureka的依赖,用在FeignClient上指定url的方式访问 dependencies { compile(' ...

  8. Spring Cloud第一篇 | Spring Cloud前言及其常用组件介绍概览

    ​ ​本文是Spring Cloud专栏的第一篇文章,了解本篇文章内容有助于更好的理解后面文章 ​ 一.网站架构演变过程 1-1.传统架构 传统的SSH架构,分为三层架构 web控制层.业务逻辑层.数 ...

  9. 转:JDK1.8-Stream()使用详解

    为什么需要 Stream Stream 作为 Java 8 的一大亮点,它与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念.它也不同于 StAX 对 ...

  10. eNSP 简介及基础操作

    eNSP 一. eNSP简介 eNSP是一款由华为自主研发的.免费的.可扩展的.图形化操作的网络仿真工具平台,主要对企业网络路由器.交换机及相关物理设备进行软件仿真,支持大型网络模拟.界面如下: 界面 ...