一日一技:二进制减法是如何进行的

简介: 一日一技:二进制减法是如何进行的

在计算机中,负数是使用它的补码来表示的。所谓补码,就是反码+1。所谓反码,就是二进制数逐位取反。所谓逐位取反,就是1变成0,0变成1。例如:

原来的二进制数: 1011011101101反码: 0100100010010补码: 0100100010011

在数学里面,当我们判断一个正数和负数的时候,是通过这个数字前面的负号来判断的,例如: 5-5。但是由于计算机里面只有0和1,如何表示负号呢?因此可以使用一个额外的1来表示。例如:

正数: 0101负数: 1101

其中最左边的0和1表示的是符号位,0为正数,1为负数。

如果到这里,你以为你看懂了,那么我问你一个问题,下面几个数有什么区别:

0101
00101
000101
0000101
00000101

下面几个数有什么区别:

1101
10101
100101
1000101
10000101

实际上,他们表示的是不同位数条件下的同一个数。因为在计算机中,你定义一个数字的时候,是需要先提前指定这个数的类型的。例如int型、long型等等。(即便你用的Python,不需要人工指定,但是在底层它也会自动指定)。所以,如果我直接说:数字5在计算机中是怎么储存的,是没有意义的。应该说,数字5在8位整型下面是怎么储存的、在32位整型下面是怎么储存的:

00000101   # 8位整型
00000000000000000000000000000101  # 32位整型

所以,对于-5,在8位整型和32位整型下面,他们是这样储存的:

10000101   # 8位整型
10000000000000000000000000000101  # 32位整型

在计算机中,一个正数的补码就是它自身,例如 00000101的补码还是 00000101,而负数的补码,就需要根据补码的规则进行计算,例如在8位整型下,-5的补码运算规则如下:

  1. 首先计算正5的二进制数:00000101
  2. 逐位取反:11111010
  3. 加1:1111011

接下来,例如我们在8位整型下,计算9-5的值,那么在计算机中,运算过程为:

  1. 求9的二进制补码(正数的补码就是它自身):00001001
  2. 求5的二进制补码:11111011
  3. 两个补码相加:100000100
  4. 由于我们是在8位整型的环境下,所以最左边这个1被直接丢掉了(溢出),结果变成:00000100
  5. 对结果再求补码。由于结果00000100最左边是0,表示正数,所以补码是自身。因此二进制数00000100对应的十进制数为4,就是正确结果。

再来看看8位整型条件下:10 - 13 = -3的过程:

  1. 计算10的二进制数补码:00001010
  2. -13的二进制补码:11110011
  3. 两个补码相加:11111101
  4. 对结果求补码,由于最左边这一位是1,表示负数,所以要把十进制负数转二进制补码的过程反过来
  5. 先转成十进制正数对应的二进制数:00000011为3
  6. 把负号加上:-3,答案正确

这里需要说明的是,在计算机中做二进制数运算时,一定要明确是在多少位的整型前提下进行的,这样才能够正确处理位数溢出的问题。

由于位数溢出,在计算机中才会出现两个正数相加,结果却是负数的情况。例如:

127 + 1,在数学上结果为128,但是在计算机中,8位整型的情况下,结果为-128。原因如下:

  1. 计算127对应的二进制补码:01111111
  2. 计算1对应的二进制补码:00000001
  3. 两个补码相加:10000000
  4. 由于结果的最左侧为1,表示负数,因此要把十进制负数转二进制补码的过程反过来
  5. 先转成十进制正数对应的二进制补码:10000000(没错,10000000的补码恰好还是10000000)也就是128
  6. 加上负号:-128
目录
相关文章
|
传感器 边缘计算 物联网
物联网架构体系(一)
物联网架构体系(一)
3327 1
|
自然语言处理 Docker 容器
elasticsearch-analysis-ik分词器下载与安装
elasticsearch-analysis-ik分词器下载与安装
3736 0
elasticsearch-analysis-ik分词器下载与安装
|
9月前
|
Web App开发 IDE 测试技术
Selenium:强大的 Web 自动化测试工具
Selenium 是一款强大的 Web 自动化测试工具,包括 Selenium IDE、WebDriver 和 Grid 三大组件,支持多种编程语言和跨平台操作。它能有效提高测试效率,解决跨浏览器兼容性问题,进行性能测试和数据驱动测试,尽管存在学习曲线较陡、不稳定等缺点,但其优势明显,是自动化测试领域的首选工具。
569 17
Selenium:强大的 Web 自动化测试工具
|
9月前
|
数据采集 人工智能 自然语言处理
Midscene.js:AI 驱动的 UI 自动化测试框架,支持自然语言交互,生成可视化报告
Midscene.js 是一款基于 AI 技术的 UI 自动化测试框架,通过自然语言交互简化测试流程,支持动作执行、数据查询和页面断言,提供可视化报告,适用于多种应用场景。
2460 1
Midscene.js:AI 驱动的 UI 自动化测试框架,支持自然语言交互,生成可视化报告
Manacher(马拉车)算法详解
该文章详细解释了Manacher算法,这是一种高效找出给定字符串最长回文子串的算法,通过在字符串中插入特殊字符构建新的字符串,并利用中心扩展策略来找出最长回文序列,时间复杂度为O(N),空间复杂度为O(N)。
|
存储 算法 编译器
【C++ 泛型编程 进阶篇】C++模板元编程深度解析:探索编译时计算的神奇之旅
【C++ 泛型编程 进阶篇】C++模板元编程深度解析:探索编译时计算的神奇之旅
1752 1
|
前端开发 Java API
Java原样导出excel模板
Java原样导出excel模板
281 0
|
存储 数据挖掘 Linux
服务器数据恢复—CentOS7操作系统服务器数据恢复案例
服务器数据恢复环境: 某品牌PowerEdge R730服务器+PowerVault MD3200存储,划分若干lun,操作系统版本是centos7,EXT4文件系统。 服务器故障&分析: 服务器在运行过程中自动关机且无法启动,服务器管理员对服务器进行修复后成功启动服务器,但服务器上原来的某个分区无法挂载。管理员将无法挂载的分区进行fsck修复&挂载,查看这个分区的数据发现部分文件丢失。
|
Java Linux 数据安全/隐私保护
libreOffice word 转 pdf
在Windows环境下,使用documents4j进行DOCX到PDF的转换大约需要20秒,而Linux环境下通过Docker配置LibreOffice进行转换,时间仅为1.4秒。documents4j仅适用于Windows且需Microsoft Office支持,libreOfficeCommand则依赖于Linux环境。Spire.Doc.Free有前4页免费但有水印,不推荐。
781 0
|
监控 Shell 开发工具
Debian安装与基本使用:详细指南及常见问题解析
【4月更文挑战第13天】本文档介绍了Debian的安装步骤、基本使用、问题解析及进阶技巧。首先,安装Debian涉及下载ISO镜像,制作启动介质,设置BIOS,然后进行安装过程,包括选择语言、分区、网络配置、软件包选择和用户账户设置。安装完成后,学会基本操作,如命令行使用、软件管理(apt)、系统更新和维护。遇到问题时,解决无线网络、分辨率、输入法和依赖问题。进阶技巧包括自定义Shell环境、使用虚拟化技术(Docker、LXC/LXD)、系统监控与性能调优,以及Git和自动化脚本的高级应用。通过学习这些技巧,可提升在Debian系统上的工作效率。
1911 0