首页 > 其他分享 >探索计算机内部的神秘语言:二进制的魅力

探索计算机内部的神秘语言:二进制的魅力

时间:2023-10-27 14:37:03浏览次数:36  
标签:右移 运算 探索 二进制 补码 1111 魅力 我们

引言

在之前的章节中,我们已经详细介绍了计算机硬件的组成部分,包括中央处理器(CPU)、内存、磁盘和总线等。因此,从今天开始,我们将深入探讨计算机内部的工作原理。首先,我们将从二进制这个简单而重要的概念开始讲解,因为计算机底层只能使用二进制来表示和处理信息。

二进制

我们都知道,计算机的底层使用二进制数据进行数据流传输。那么,为什么计算机要使用二进制表示呢?又什么是二进制数呢?更进一步地,我们如何使用二进制进行加减乘除运算呢?接下来,我们将一一解答这些问题。

什么是二进制数

那么,什么是二进制数呢?为了详细说明这个问题,我们先将一个二进制数 00100111 转换为十进制数进行观察。将二进制数转换为十进制数的方法是,直接将各个位置上的值乘以相应的位权,然后相加得到结果。那么,让我们来将上述的二进制数转换为十进制数。

image

根据转换规则,将二进制数 00100111 转换为十进制数,结果为 39。这里的 39 不是由数字 3 和 9 连在一起写成的,而是由 3 乘以位权 10 和 9 乘以位权 1 相加得到的。而这些位权,从高位到低位依次为 7、6、5、4、3、2、1、0。这些位权也可以被称为次幂,例如最高位的位权就是 2 的 7 次幂,第二位的位权就是 2 的 6 次幂,以此类推。

在二进制数的运算中,每次运算都是以基数 2 作为底数。而十进制数的基数则是 10。在任何情况下,位权的值都是数的位数减去 1。因此,第一位的位权为 1 - 1 = 0,第二位的位权为 2 - 1 = 1,以此类推。

移位运算和乘除的关系

在我们了解了二进制数之后,接下来让我们来探讨一下二进制数的运算。和十进制数一样,二进制数也可以进行加减乘除运算,只需要注意到逢二进位即可。二进制数的运算是计算机程序中的基础运算,因此了解二进制的运算是至关重要的。

首先,让我们来介绍一下移位运算。移位运算是指将二进制数的各个位置上的元素进行左移和右移操作。具体的操作可以参考下图:

image

移位运算在计算机中被广泛应用,可以用于快速进行乘以或除以2的幂次的运算。同时,移位运算也可以用来提取或插入二进制数中的特定位。

除了移位运算,还有其他的二进制运算,如按位与、按位或、按位异或等。这些运算可以用于处理和操作二进制数据,在计算机科学中有着重要的应用。

补数

刚才我们没有介绍右移的情况,是因为右移之后空出来的高位数值有两种形式:0和1。为了区分补0和补1的情况,我们需要了解二进制数表示负数的方法。

一般来说,二进制数中用最高位作为符号位来表示负数。符号位为0表示正数,为1表示负数。那么如何用二进制数表示-1呢?很多人可能会认为,因为1的二进制是0000 0001,最高位是符号位,所以-1应该表示为1000 0001。但是这个答案是否正确呢?

实际上,计算机中没有减法运算,计算机在做减法时实际上是通过加法来实现的,即用加法来表示减法运算。例如100-60,在计算机中实际上看作是100+(-60)。为了表示负数,我们需要使用二进制补码,即用正数表示负数。

为了得到补码,我们需要将二进制的各位数值全部取反,然后再加1。记住这个结论因为他适用于所有负数,下面我们来演示一下。

image

具体来说,要获取某个数值的二进制补码,需要先获取该数值的二进制表示,然后对每一位进行取反操作(0变为1,1变为0),最后再将取反后的数值加1,这样就得到了补码。

尽管补码的获取可能在直观上不容易理解,但在逻辑上是非常严谨的。举个例子,我们来看一下1-1的过程。我们先用上面提到的1000 0001(我们假设它是1的补码,如果不了解,请参考前文,先不管补码是否是对的)来表示一下。

image

奇怪,1 - 1 为什么会变成 130 而不是 0?这个结果看起来很奇怪,我们来分析一下。

对于正数 1,它的二进制表示是 0000 0001。现在我们将其转成补码。首先取反各位得到 1111 1110,然后加1,得到补码 1111 1111,即 -1 的补码表示。

接下来,我们来验证一下 -1 的补码表示是否正确。

image

我们可以观察到,1 - 1 实际上是 1 + (-1) 的运算。对于 -1,我们可以使用上面提到的方法来求其补码表示。通过取反 + 1 的过程,我们得到了补码 1111 1111。然后,将补码 1111 1111 与 1 进行加法运算。

在加法运算中,我们会得到一个九位的结果 1 0000 0000。然而,在计算机中,发生了溢出的情况下,会直接忽略掉溢出位,即最高位的 1。因此,结果变为 0000 0000,即 0。所以,我们得出的结果是正确的,1111 1111 表示的是 -1。

综上所述,负数的二进制表示是通过先求其补数,即对原始数值的二进制数各位取反,然后将结果加1。这样可以得到正确的负数的二进制表示。

算数右移和逻辑右移的区别

在了解了补数的概念之后,我们需要重新考虑一下右移这个问题。右移操作会导致最高位出现两种情况,即0和1。

当我们将二进制数作为带符号的数值进行右移运算时,移位后需要在最高位填充移位前的符号位的值(0或1)。这种右移方式被称为算术右移。如果数值是负数且使用补码表示,那么右移后需要在最高位补1,这样才能正确地表示数值的1/2、1/4、1/8等运算结果。而如果是正数,则直接在最高位补0即可。

下面我们来看一个右移的例子,将-4右移两位,大家可以参考移位示意图来理解。

image

根据上图所示,当进行逻辑右移操作时,-4右移两位会变成63,显然这不是它的1/4,因此逻辑右移不适用于这种情况。而在算数右移的情况下,-4右移两位会变为-1,显然这是它的1/4,所以我们选择采用算数右移。

因此,我们可以得出一个结论:在左移操作中,无论是正数还是负数,只需要将低位补0即可;而在右移操作中,需要根据具体情况判断是应该进行逻辑右移还是算数右移。

现在我要介绍一下符号扩展的概念。符号扩展是为了在保持数值不变的前提下,增加数据的位数,以满足某些指令对操作数位数的要求。它可以用于使被除数比除数位数更长,或者用于增加数据位数以减少计算过程中的误差。

以8位二进制数为例,符号扩展的目标是将其转换为16位或32位二进制数,而保持数值不变。对于一个8位正数二进制数0111 1111,很容易得到正确的16位结果0000 0000 0111 1111。但对于一个用补码表示的负数,比如补码1111 1111,我们该如何处理呢?我们只需要直接将其表示为16位二进制数1111 1111 1111 1111。换句话说,无论是正数还是补码表示的负数,只需要在高位填充0或1即可。

总结

通过本文的学习,我们深入了解了计算机内部工作原理中的二进制数、移位运算、补数表示、算术右移和逻辑右移等重要概念。我们了解到计算机底层使用二进制来表示和处理信息的原因,并学习了二进制数的转换方法和位权的概念。我们还探讨了移位运算和二进制数的运算,并介绍了移位运算在计算机中的应用。此外,我们学习了二进制补数的概念和计算方法,以及符号扩展的原理和应用。最后,我们讨论了算术右移和逻辑右移的区别,并总结了在左移和右移操作中应该采用的补位方法。通过本文的学习,我们对计算机内部工作原理有了更深入的了解,为进一步学习和研究计算机科学打下了坚实的基础。

标签:右移,运算,探索,二进制,补码,1111,魅力,我们
From: https://www.cnblogs.com/guoxiaoyu/p/17775790.html

相关文章

  • R语言用逻辑回归预测BRFSS中风数据、方差分析anova、ROC曲线AUC、可视化探索
    行为风险因素监测系统(BRFSS)是一项年度电话调查。BRFSS旨在确定成年人口中的风险因素并报告新兴趋势。例如,调查对象被询问他们的饮食和每周体育活动、HIV/AIDS状况、可能的吸烟情况、免疫接种、健康状况、健康日数-与健康相关的生活质量、医疗保健获取、睡眠不足、高血压认知、胆固......
  • 可观察性支柱:探索日志、指标和跟踪
    通过检查系统输出来测量系统内部状态的能力称为可观察性。当可以仅使用输出信息(即传感器数据)来估计当前状态时,系统就变得“可观察”。您可以使用来自Observability的数据来识别和解决问题、优化性能并提高安全性。在接下来的几节中,我们将仔细研究可观察性的三大支柱:指标、日志和......
  • 揭秘计算机奇迹:探索I/O设备的神秘世界!
    引言在之前的章节中,我们详细讲解了计算机系统中一些核心组成部分,如中央处理器(CPU)、内存、硬盘等。这些组件负责处理和存储数据,使得计算机能够有效地运行。然而,除了这些核心组件,计算机系统还包含许多其他重要的部分,其中之一就是输入输出设备。它们使得计算机能够与用户进行有效的......
  • 智安网络|探索语音合成技术的未来:揭秘人工智能配音技术的背后
    随着人工智能技术的迅猛发展,配音行业也迎来了人工智能配音技术的崭新时代。人工智能配音技术通过语音合成和自然语言处理等技术手段,实现了逼真的语音合成,为影视、广告和游戏等领域带来了新的可能性。第一部分:语音合成技术的发展语音合成技术是人工智能配音技术的核心,它通过将文本转......
  • 可观察性支柱:探索日志、指标和跟踪
    通过检查系统输出来测量系统内部状态的能力称为可观察性。当可以仅使用输出信息(即传感器数据)来估计当前状态时,系统就变得“可观察”。您可以使用来自Observability的数据来识别和解决问题、优化性能并提高安全性。在接下来的几节中,我们将仔细研究可观察性的三大支柱:指标、日志和......
  • 转换字符串为二进制编码字符串
    varfillZeroToEight=function(numStr){if(numStr.length>=8){returnnumStr;}vardiff=8-numStr.length;varzeroStr="";for(letindex=0;index<diff;index++){zeroStr+="0"......
  • 五矿期货:悦数图数据库在金融期货行业的应用与实践探索
    本文整理自五矿集团-五矿期货有限公司副总经理-张剑锋在NUC2022年度用户大会上的分享。大家好,我是五矿期货的张剑锋。今天十分感谢悦数科技能够提供这个跟各位专家,还有行业技术大拿们当面学习和交流的机会。首先介绍一下期货行业。在中国的六大金融行业里面,银行,保险,还有信托,是......
  • 其他进制转换成二进制
    0.背景在嵌入式开发中,我们要操作寄存器,都是按bit来操作的,但是我们的数据一般都是十进制或者十六进制,经过一些位运算,很难看明白一个某一位是多少,所以我们开发一个打印函数,来看看具体某一位是多少。一、十进制转二进制https://www.cnblogs.com/haoran123/p/17782069.html转换......
  • 【Python 千题 —— 基础篇】进制转换:十进制转二进制
    题目描述题目描述计算机底层原理中常使用二进制来表示相关机器码,学会将十进制数转换成二进制数是一个非常重要的技能。现在编写一个程序,输入一个十进制数,将其转换成二进制数。输入描述输入一个十进制数。输出描述程序将输入的十进制数转换为二进制数,并输出其二进制形式。示例示例......
  • 定位SQLServer数据库执行语句的二进制截断提示的超长字段
    constConstTSQL='|INSERT|UPDATE|DELETE|CREATE|ALTER|DROP|EXEC|';functionFindDbShortField(aQry:TFDQuery):String;//搜指定SQL关键字functionSearchSQLWord(constSQL,sWord:string;varindex:Integer):Boolean;varI:Integer;s:String......