一、基础知识

做这题需要用到计算机组成原理的基础知识:二进制的表示以及加法器。

简要提下知识点,最好再去研究下来龙去脉,加深理解。

(1)二进制加法

a b 非进位和s 进位c
0 0 0 0
0 1 1 0
1 0 1 0
1 1 0 1

对于非进位和,满足异或运算。
s=a⨁bs=a \bigoplus bs=a⨁b
对于进位,满足运算。
c=a&bc=a \& bc=a&b

(2)二进制补码

对于有符号整数来说,首位是符号位,符号位是0表示正数,符号位为1表示负数,其余31位表示数值部分。
但,不论正数还是负数,在计算机中都是用二进制补码来存储的
对于正数,补码、反码和其原码相同。
对于负数 ,补码等于其原码的反码再加1。

例:3,数值部分为11,符号位为0。
原码:00000000 00000000 00000000 00000011
反码:00000000 00000000 00000000 00000011
补码:00000000 00000000 00000000 00000011

例:-2,数值部分为10,符号为1.
原码:100000000 00000000 00000000 00000010
反码:1111111111 111111111 111111111 111111101
补码:1111111111 111111111 111111111 111111110

二进制的补码使得减法运算也能通过加法来实现
例:-2 + 3 = 1

二、代码实现

C代码参考自评论区,相当简洁(不好理解):

int add(int a, int b){int carry = 0;while(b){carry = (unsigned)(a&b)<<1;a ^= b;b = carry;}return a;
}

解释:两数相加的二进制加法模拟,
(1)通过与运算得到进位的值。有符号整数进行移位操作时,符号位没有移动,移位不能改变符号位的值。而在补码运算中,符号位要参与运算,所以在移位前要强转,将其当做无符号数来处理。进位比当前位要高1位,所以整体左移1位。
(2)通过异或运算得到非进位和。
(3)进位的值要和进位所在位进行相加,这就又回到了前面的步骤(1)(2),直到进位值为0。

时间复杂度O(1)O(1)O(1),空间复杂度O(1)O(1)O(1)。

剑指 Offer 65. 不用加减乘除做加法(位运算,计组原理:补码、加法器)相关推荐

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

    本文参考自<剑指offer>一书,代码采用Java语言. 题目 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.×.÷四则运算符号. 思路 对数字做运算,除了四则运算外,只剩下位 ...

  2. 【LeetCode】剑指 Offer 65. 不用加减乘除做加法

    [LeetCode]剑指 Offer 65. 不用加减乘除做加法 文章目录 [LeetCode]剑指 Offer 65. 不用加减乘除做加法 一.位运算 一.位运算 本题考察对位运算的灵活使用,即使用 ...

  3. 剑指 Offer 65. 不用加减乘除做加法(位运算、递归、迭代)

    一.题目 剑指 Offer 65. 不用加减乘除做加法 题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用 "+"."-"."*" ...

  4. 0位运算/数学简单 剑指 Offer 65. 不用加减乘除做加法

    剑指 Offer 65. 不用加减乘除做加法 描述 写一个函数,求两个整数之和,要求在函数体内不得使用 "+"."-"."*"." ...

  5. 【LeetCode笔记】剑指 Offer 65. 不用加减乘除做加法(Java、位运算、二刷)

    文章目录 题目描述 思路 & 代码 二刷 题目描述 讲道理,感觉算有点难度的题目了= =,还是需要时不时看看. 思路 & 代码 正负数情况可以不考虑(补码) 核心:加法 = 进位和 + ...

  6. 剑指 Offer 65. 不用加减乘除做加法

    题目链接: 力扣https://leetcode.cn/problems/bu-yong-jia-jian-cheng-chu-zuo-jia-fa-lcof/ [分析]对于两个二进制的加法,他们的本 ...

  7. leetcode每日一题第三十二天-剑指 Offer 65. 不用加减乘除做加法(easy??middle了吧)

    前言 通过leetcode记录自己每天坚持刷题,以此监督自己的学习.不能放假了就懈怠

  8. 剑指offer面试题65. 不用加减乘除做加法(位运算)

    题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用 "+"."-"."*"."/" 四则运算符号. 思路 详见 ...

  9. 《剑指Offer》 不用加减乘除做加法

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

最新文章

  1. 知乎如何运用OKR管理公司目标,达成绩效?
  2. 大数据时代的隐身模式下的大数据创业公司
  3. 科技/IT:2019 年 Q3 表现最佳和最差的企业
  4. 新华网泸州分频道报道IT诗人
  5. Swift之深入解析枚举enum的底层原理
  6. 电商 APP 下单页(俗称车2) 业务流程概要设计
  7. 快速根据注释生成接口文档网页工具——Apidoc的使用教程
  8. tornado websocket
  9. Jupyter Notebook 快速入门
  10. Python字符串逆序输出
  11. 程序员外包兼职平台介绍
  12. 优秀的 Verilog/FPGA开源项目介绍(二十九)- 开源网站
  13. 计算机休眠模式是关机吗,电脑中的待机、休眠、睡眠和关机状态的区别。
  14. Linux查看DNS
  15. Hi3516CV500_SDK_V2.0.1.1 编译osdrv目录
  16. excel表格保护单元格教程加破解(忘记密码情况下破解)
  17. 银行计考试-计算机考点2-计算机系统组成与基本工作原理
  18. 人工智能概念站上风口
  19. 电影魔术|改变世界?乔布斯可不仅仅用苹果
  20. Gitee第三方登录

热门文章

  1. 如何备考一级建造师?网课 视频 教材如何选择?从哪里下手?小白零基础一次过一建!
  2. 【JavaWeb】eclipse中常见报错解决汇总
  3. mooc数据结构与算法python版第十周作业_中国大学mooc慕课_数据结构与算法Python版_章节答案...
  4. Linux驱动开发 --- IIC总线
  5. 雨课堂2.1软件过程与配置管理
  6. H264编码profile level控制
  7. 浅谈深度学习中的激活函数 - The Activation Function in Deep Learning
  8. 华硕固件中frp启动问题
  9. 433和2.4G无线通信比较
  10. 微信支付关键点技术解析