剑指 Offer 65. 不用加减乘除做加法(位运算,计组原理:补码、加法器)
一、基础知识
做这题需要用到计算机组成原理的基础知识:二进制的表示以及加法器。
简要提下知识点,最好再去研究下来龙去脉,加深理解。
(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. 不用加减乘除做加法(位运算,计组原理:补码、加法器)相关推荐
- java 加法不用_【Java】 剑指offer(65) 不用加减乘除做加法
本文参考自<剑指offer>一书,代码采用Java语言. 题目 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.×.÷四则运算符号. 思路 对数字做运算,除了四则运算外,只剩下位 ...
- 【LeetCode】剑指 Offer 65. 不用加减乘除做加法
[LeetCode]剑指 Offer 65. 不用加减乘除做加法 文章目录 [LeetCode]剑指 Offer 65. 不用加减乘除做加法 一.位运算 一.位运算 本题考察对位运算的灵活使用,即使用 ...
- 剑指 Offer 65. 不用加减乘除做加法(位运算、递归、迭代)
一.题目 剑指 Offer 65. 不用加减乘除做加法 题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用 "+"."-"."*" ...
- 0位运算/数学简单 剑指 Offer 65. 不用加减乘除做加法
剑指 Offer 65. 不用加减乘除做加法 描述 写一个函数,求两个整数之和,要求在函数体内不得使用 "+"."-"."*"." ...
- 【LeetCode笔记】剑指 Offer 65. 不用加减乘除做加法(Java、位运算、二刷)
文章目录 题目描述 思路 & 代码 二刷 题目描述 讲道理,感觉算有点难度的题目了= =,还是需要时不时看看. 思路 & 代码 正负数情况可以不考虑(补码) 核心:加法 = 进位和 + ...
- 剑指 Offer 65. 不用加减乘除做加法
题目链接: 力扣https://leetcode.cn/problems/bu-yong-jia-jian-cheng-chu-zuo-jia-fa-lcof/ [分析]对于两个二进制的加法,他们的本 ...
- leetcode每日一题第三十二天-剑指 Offer 65. 不用加减乘除做加法(easy??middle了吧)
前言 通过leetcode记录自己每天坚持刷题,以此监督自己的学习.不能放假了就懈怠
- 剑指offer面试题65. 不用加减乘除做加法(位运算)
题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用 "+"."-"."*"."/" 四则运算符号. 思路 详见 ...
- 《剑指Offer》 不用加减乘除做加法
题目描述: 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 思路: 首先看十进制是如何做的: 5+7=12,三步走 第一步:相加各位的值,不算进位,得到2. 第二步:计 ...
最新文章
- 知乎如何运用OKR管理公司目标,达成绩效?
- 大数据时代的隐身模式下的大数据创业公司
- 科技/IT:2019 年 Q3 表现最佳和最差的企业
- 新华网泸州分频道报道IT诗人
- Swift之深入解析枚举enum的底层原理
- 电商 APP 下单页(俗称车2) 业务流程概要设计
- 快速根据注释生成接口文档网页工具——Apidoc的使用教程
- tornado websocket
- Jupyter Notebook 快速入门
- Python字符串逆序输出
- 程序员外包兼职平台介绍
- 优秀的 Verilog/FPGA开源项目介绍(二十九)- 开源网站
- 计算机休眠模式是关机吗,电脑中的待机、休眠、睡眠和关机状态的区别。
- Linux查看DNS
- Hi3516CV500_SDK_V2.0.1.1 编译osdrv目录
- excel表格保护单元格教程加破解(忘记密码情况下破解)
- 银行计考试-计算机考点2-计算机系统组成与基本工作原理
- 人工智能概念站上风口
- 电影魔术|改变世界?乔布斯可不仅仅用苹果
- Gitee第三方登录
热门文章
- 如何备考一级建造师?网课 视频 教材如何选择?从哪里下手?小白零基础一次过一建!
- 【JavaWeb】eclipse中常见报错解决汇总
- mooc数据结构与算法python版第十周作业_中国大学mooc慕课_数据结构与算法Python版_章节答案...
- Linux驱动开发 --- IIC总线
- 雨课堂2.1软件过程与配置管理
- H264编码profile level控制
- 浅谈深度学习中的激活函数 - The Activation Function in Deep Learning
- 华硕固件中frp启动问题
- 433和2.4G无线通信比较
- 微信支付关键点技术解析