二进制数及其运算

article/2025/9/25 0:26:47

计算机的底层都是使用二进制数据进行数据流传输的,那么为什么会使用二进制表示计算机呢?什么是二进制数呢?如何使用二进制进行加减乘除?二进制数如何表示负数呢?本文将为你揭晓。

为什么用二进制表示
计算机内部是由IC电子元件组成的,其中CPU和内存也是IC电子元件的一种,CPU和内存使用IC电子元件作为基本单元。IC电子元件有不同种形状,但是其内部的组成单元称为一个个的引脚。有人说CPU和内存内部都是超大规模集成电路,其实IC就是集成电路。
在这里插入图片描述
IC元件两侧排列的四方形块就是引脚,IC的所有引脚,只有两种电压: 0V和5V,IC的这种特性也就决定了计算机的信息处理只能用0和1表示,也就是二进制来处理。一个引脚可以表示一个0或1,所以二进制的表示方式就变成0、1、10、11、100、101等,虽然二进制数并不是专门为引脚来设计的,但是和IC引脚的特性非常吻合。

计算机的最小集成单位为位,也就是比特(bit) ,二进制数的位数一般为8位、16位、 32位、 64位,也就是8的倍数,为什么要跟8扯上关系呢?因为在计算机中,把8位二进制数称为一个字节,一个字节有8位,也就是由8个bit构成。字节是最基本的计量单位,位是最小单位。

用字节处理数据时,如果数字小于存储数据的字节数(二进制的位数),那么高位就用0填补,高位和数学的数字表示是一样的, 左侧表示高位,右侧表示低位。比如这个六位数用二进制数来表示就是100111,只有6位,高位需要用0填充,填充完后是00100111,占一个字节,如果用16位表示就是0000 0000 0010 0111占用两个字节。

我们一般口述的32位和64位的计算机就指的是处理位数,32 位一次可以表示4个字节, 64位一次可以表示8个字节的二进制数。

什么是二进制数
那么什么是二进制数呢?为了说明这个问题,我们先把0010 0111这个数转换为十进制数看一下:
在这里插入图片描述
也就是说,二进制数代表的00100111 转换成十进制就是39,这个39并不是3和9两个数字连着写,而是3* 10+9*1,这里面的10,1就是位权, 以此类推,上述例子 中的位权从高位到低位依次就是76543210,这个位权也叫做次幂,那么最高位就是2的7次幂,,2的6次幂等等。二进制数的运算每次都会以2为底,这个2指得就是基数,那么十进制数的基数也就是10。在任何情况下位权的值都是数的位数- 1,那么第一位的位权就是1-1=0,第二位的位权就是2-1= 1,以此类推。

那么二进制数其实就是用0和1两个数字来表示的数,它的基数为2,它的数值就是每个数的位数* 位权再求和得到的结果,我们一般来说数值指的就是十进制数,那么它的数值就是3* 10+ 9* 1= 39。

移位运算和乘除的关系
下面我们来看一下二进制的运算,和十进制数一样,加减乘除也适用于二进制数,只要注意逢2进位即可。二进制数的运算,也是计算机程序所特有的运算,因此了解二进制的运算是必须要掌握的。
首先我们来介绍移位运算, 移位运算是指将二进制的数值的各个位置上的元素坐左移和右移操作,见下图:
在这里插入图片描述
上述例子中还是以39为例,我们先把十进制的39转换为二进制的0010 0111 ,然后向左移位<<一个字节,也就变成了 0100 1110,那么再把此二进制数转换为十进制数就是上面的78, 十进制的78竟然是十进制39的2倍关系。我们在让0010 0111左移两位,也就是1001 1100 ,得出来的值是156,相当于扩大了四倍!

因此你可以得出来此结论,左移相当于是数值扩大的操作,那么右移>> 呢?按理说右移应该是缩小1/2,1/4倍,但是39缩小二倍和四倍不就变成小数了吗?这个怎么表示呢?

便于计算机处理的补数
刚才我们没有介绍右移的情况,是因为右移之后空出来的高位数值,有0和1两种形式。要想区分什么时候补0什么时候补1,首先就需要掌握二进制数表示负数的方法。

二进制数中表示负数值时,一般会把最高位作为符号来使用,因此我们把这个最高位当作符号位。符号位是0时表示正数,是1时表示负数。那么-1用二进制数该如何表示呢?可能很多人会这么认为:因为1的二进制数是0000 0001 ,最高位是符号位,所以正确的表示-1,但是这个答案真的对吗?

计算机世界中是没有减法的,计算机在做减法的时候其实就是在做加法,也就是用加法来实现的减法运算。比如100-50,其实计算机来看的时候应该是100 + (-50),为此,在表示负数的时候就要用到二进制补数,补数就是用正数来表示的负数。

为了获得补数,我们需要将二进制的各数位的数值全部取反,然后再将结果+ 1即可,先记住这个结论,下面我们来演示一下:
在这里插入图片描述
具体来说,就是需要先获取某个数值的二进制数,然后对二进制数的每一位做取反操作(0 -->- 1 , 1 -->),最后再对取反后的数+1,这样就完成了补数的获取。

补数的获取,虽然直观上不易理解,但是逻辑上却非常严谨,比如我们来看一下1-1的这个过程:
在这里插入图片描述
奇怪,1-1会变成130,而不是0,所以可以得出结论1000 0001 表示-1是完全错误的。那么正确的该如何表示呢?其实我们上面已经给出结果了,那就是1111 1111,来论证一下它的正确性:
在这里插入图片描述
我们可以看到1 -1其实实际上就是1 +(-1),对-1进行上面的取反+ 1后变为1111 1111,然后与1进行加法运算,得到的结果是九位的1 0000 0000,结果发生了溢出,计算机会直接忽略掉溢出位,也就是直接抛掉最高位1,变为0000 0000。也就是0,结果正确,所以1111 1111表示的就是-1。所以负数的二进制表示就是先求其补数,补数的求解过程就是对原始数值的二进制数各位取反,然后将结果+ 1。

当然,结果不为0的运算同样也可以通过补数求得正确的结果。不过,有一点需要注意,当运算结果为负的时候,计算结果的值也是以补数的形式出现的,比如3-5这个运算,来看一下解析过程:
在这里插入图片描述
3-5的运算,我们按着上面的思路来过一遍,计算出来的结果是1111 1110 ,我们知道,这个数值肯定表示负数,但是负数无法直接用十进制表示,需要对其取反+ 1,算出来的结果是2,因为11111110的高位是1,所以最终的结果是-2。

编程语言的数据类型中,有的可以处理负数,有的不可以。比如C语言中不能处理负数的unsigned short 类型,也有能处理负数的short 类型,都是两个字节的变量,它们都有2的十六次幂种值,但是取值范围不一样, short类型的取值范围是-32768 - 32767,unsigned short的取值范围是0 -65536。

仔细思考一下补数的机制,就能明白-32768 比32767多一个数的原因了,最高位是0的正数有0~32767共32768个,其中包括0。最高位是1的负数,有-1 ~ -32768共32768个,其中不包含0。0虽然既不是正数也不是负数,但是考虑到其符号位,就将其归为了正数。

算数右移和逻辑右移的区别
在了解完补数后,我们重新考虑一下右移这个议题,右移在移位后空出来的最高位有两种情况0和1。当二进制数的值表示图形模式而非数值时,移位后需要在最高位补0,这就被称为逻辑右移。
在这里插入图片描述
将二进制数作为带符号的数值进行右移运算时,移位后需要在最高位填充移位前符号位的值(0或1)。这就被称为算数右移。如果数值使用补数表示的负数值,那么右移后在空出来的最高位补1,就可以正确的表示1/2,1/4, 1/8等的数值运算。如果是正数,那么直接在空出来的位置补0即可。

下面来看一个右移的例子。将-4右移两位,来各自看一下移位示意图:
在这里插入图片描述
如上图所示,在逻辑右移的情况下,-4右移两位会变成63,显然不是它的1/4, 所以不能使用逻辑右移,那么算数右移的情况下,右移两位会变为-1, 显然是它的 1/4,故而采用算数右移。

那么我们可以得出来一个结论: 左移时,无论是图形还是数值,移位后,只需要将低位补0即可;右移时,需要根据情况判断是逻辑右移还是算数右移。

逻辑运算的窍门
掌握逻辑和运算的区别是:将二进制数表示的信息作为四则运算的数值来处理就是算数,像图形那样,将数值处理为单纯的0和1的罗列就是逻辑。

计算机能够处理的运算,大体可分为逻辑运算和算数运算,算数运算指的是加减乘除四则运算;逻辑运算指的是对二进制各个数位的0和1分别进行处理的运算,包括逻辑非(NOT运算)、逻辑与(AND运算)、逻辑或(OR运算)和逻辑异或(XOR运算)四种。

  • 逻辑非 指的是将0变成1, 1变成0的取反操作
  • 逻辑与指的是“两个都是 1时,运算结果才是1,其他情况下是0”
  • 逻辑或指的是“至少有一方是 1时,运算结果为1,其他情况下运算结果都是0”
  • 逻辑异或 指的是“其中一方是1,另一方是0时运算结果才是1,其他情况下是0”
    在这里插入图片描述
    掌握运算的窍门,就是要摒弃二进制数表示数值这一个想法。大家不要把二进制数表示的值当作数值,应该把它看成是开关上的ON/OFF。

http://chatgpt.dhexx.cn/article/hLHEJkg7.shtml

相关文章

二进制数的运算

文章目录 前言一、加法运算规则二、减法运算规则三、乘法运算规则四、除法运算规则五、逻辑或运算规则六、逻辑与运算规则七、逻辑非运算规则八、逻辑异或运算规则 前言 此篇文章仅介绍二进制数的运算&#xff0c;不涉及其他进制的运算 一、加法运算规则 000 011 101 110 &…

什么是二进制数?二进制数是如何表示计算机信息的?

二进制是什么&#xff1f; 想要了解二进制数是如何表示计算机信息的&#xff1f;先要追本溯源&#xff0c; 二进制&#xff08;binary&#xff09;在数学和数字电路中指以2为基数的记数系统&#xff0c;以2为基数代表系统是二进位制的。这一系统中&#xff0c;通常用两个不同的…

二进制

博客引用处&#xff08;以下内容在原有博客基础上进行补充或更改&#xff0c;谢谢这些大牛的博客指导&#xff09;&#xff1a; 二进制 二进制和十进制间小数怎么转换 二进制进位 前言&#xff1a; 二进制是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的…

二进制(bit)整数

计算机以电子电荷集合的形式在内存中保存指令和数据。用数字来表示这些内容就需要系统能够适应开 / 关(on/off)或真 / 假(true/false)的概念。 二进制数(binary number)用 2 个数字作基础,其中每一个二进制数字(称为位,bit)不是 0 就是 1。 位自右向左,从 0 开始顺…

计算机基础(一):二进制详解

二进制 我们都知道&#xff0c;计算机的底层都是使用二进制数据进行数据流传输的&#xff0c;那么为什么会使用二进制表示计算机呢&#xff1f;或者说&#xff0c;什么是二进制数呢&#xff1f;在拓展一步&#xff0c;如何使用二进制进行加减乘除&#xff1f;二进制数如何表示…

图论学习笔记——可达矩阵

设有向图D &#xff08;V,E&#xff09;,顶点集V {v1&#xff0c;v2&#xff0c;&#xff0c;vn}。 定义矩阵 为&#xff08;当vi到vj不可达时&#xff0c;p为0&#xff1b;当vi到vj可达时p为1.&#xff09; 称矩阵P是图D的可达矩阵 一般地&#xff0c;设n阶有向图D的邻接…

传递闭包和可达矩阵的关系?

今天的这篇博客让我沉思了好久~~~ 传递闭包矩阵的定义如下所示&#xff1a; 可达矩阵的定义如下图所示&#xff1a; 通过以上两个图片可以看出这两个定义有所区别&#xff0c;这篇博客所讲解的就是传递闭包和可达矩阵的关系&#xff1f;这是为什么呢&#xff1f;传递闭包定义为…

用java不带权有向图求可达矩阵_ISM算法(邻接矩阵求可达矩阵)Java实现

图如下: package com;public class Main {public static void main(String[] args) {// 邻接矩阵int adjacency[][] { { 0, 0, 0, 0, 0 }, { 0, 0, 1, 1, 0 }, { 1, 0, 0, 1, 0 }, { 0, 0, 1, 0, 1 },{ 1, 0, 0, 0, 0 } };// 可达矩阵int reachability[][] null;System.out.p…

【有限马尔科夫链状态分解+Kosaraju 算法】基于Kosaraju 算法和可达矩阵的有限马尔科夫链状态分解

有限马尔科夫链状态分解Kosaraju 算法 1 实验内容2 理论基础3 题目分析4 按常返性和互通性对状态空间进行分解算法流程4.1 强连通性和强连通分量4.2 基于有向图 Kosaraju 算法的有限马尔科夫链状态分解4.3 算法正确性证明4.4 算法复杂度分析 5 按周期对不可约闭集进行分解6 对例…

R 语言 | 计算可达矩阵

在微博有位朋友问我可达矩阵的计算&#xff0c;于是发了点时间用R语言写出来了。 问题如下&#xff1a; 计算过程&#xff1a; 注意&#xff1a;是矩阵的乘法。 代码如下&#xff1a; A <- matrix(c(0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0),nrow5) A1 …

一种使用Python计算可达矩阵的简单方法

在进行编码前要简单介绍几个知识点&#xff1a;有向图&#xff0c;邻接矩阵&#xff0c;可达矩阵 有向图、邻接矩阵、可达矩阵 有向图 现实中常常会表示从一个地点到另一个地点的路径&#xff0c;这样的带有从起点到终点的路线表示可以用有向图表示。如下图所示&#xff1a;…

系统工程利用python求解可达矩阵

系统工程中利用python求解可达矩阵 在系统工程书中&#xff0c;建立解释结构模型中求解可达矩阵是必不可少的一环故利用python写了一段求解可达矩阵的代码&#xff0c;只需要输入邻接矩阵便可计算得到可达矩阵代码如下&#xff1a; import numpy as npdef change(a): 乘以自身…

通过有向图的可达矩阵判断有向图的连通类型

我们根据有向图的连通情况&#xff0c;可以将图分成四种类型 非连通图弱连通图单向连通图强连通图 我们可以通过邻接矩阵A&#xff0c;计算可达矩阵B&#xff0c;然后经过二值化之后得到可达性矩阵P来判断该图属于以上哪一种。 如果P中元素都为1&#xff0c;说明任意两点之间…

【算法导论】有向图的可达矩阵

有时候&#xff0c;我们关注的不是从一个地点到另一个地点的费用&#xff0c;而是能否从一个顶点到达另一个顶点。因此我们可以假设所有边的权值为单位1&#xff0c;在下面的算法中&#xff0c;我们可以在O(n*n*n)的时间内计算出图中任意两点是否可达&#xff0c;我用可达矩阵来…

图论总复习

《图论及其应用》 主要考试知识点&#xff1a; 第2章&#xff0c;第 3章&#xff0c;第5 章&#xff0c;第 6章&#xff0c;章节占比&#xff1a;20%&#xff0c;25%&#xff0c;30%&#xff0c;25%。 **第2章&#xff1a;**图的定义、度的概念、握手定理、可图画、同构、子…

图的邻接矩阵求图的出度,入度,可达矩阵,判断强连通,弱连通,单向连通(C++,vs2017)

一、介绍概念 1、邻接矩阵 将一个n个节点的图&#xff0c;转化成一个n*n的矩阵G&#xff0c;G[i][j]表示第i个节点到第j个节点的的权重。 对于上图邻接矩阵为&#xff1a; 2、度 度分为入度和出度&#xff1a;某个节点的入度就是可以通过一条边到达这个节点的节点个数&#xff…

【离散数学】图论 第七章(3) 图的矩阵表示(邻接矩阵、可达矩阵、传递闭包求解算法)

本文属于「离散数学」系列文章之一。这一系列着重于离散数学的学习和应用。由于内容随时可能发生更新变动&#xff0c;欢迎关注和收藏离散数学系列文章汇总目录一文以作备忘。此外&#xff0c;在本系列学习文章中&#xff0c;为了透彻理解数学知识&#xff0c;本人参考了诸多博…

硬盘的存储原理和内部架构

首先&#xff0c;让我们看一下硬盘的发展史&#xff1a; 1956年9月13日&#xff0c;IBM的IBM 350 RAMAC(Random Access Method of Accounting and Control)是现代硬盘的雏形&#xff0c;整个硬盘需要50个直径为24英寸表面涂有磁浆的盘片&#xff0c;它相当于两个冰箱的体积&…

硬盘结构与工作原理

一、硬盘的接口 接口种类&#xff1a; ATA(Advanced Technology Attachment)(IDE):速度最大可达133MB/S; SATA(Serial ATA):速度最大可达300MB/S SCSI(Small Computer System Interface):转速最大可达15000rpm SAS(Serial Attachment SCSI):速度最大可达6GB/S 二、硬盘的物理结…