巴西作家保罗·科埃略的一句话:「如果你想成功,你必须遵守一条规则:永远不要对自己撒谎。」

大家好,我是「柒八九」

今天,我们继续「计算机底层知识」的探索。我们来谈谈关于「二进制」的相关知识点。

如果,想了解该系列的文章,可以参考我们已经发布的文章。如下是往期文章。

文章list

  1. 计算机底层知识之CPU

你能所学到的知识点

  1. 用二进制数表示计算机信息的原因 「推荐阅读指数」 ⭐️⭐️⭐️⭐️
  2. 什么是二进制 「推荐阅读指数」 ⭐️⭐️⭐️⭐️⭐️
  3. 补数 「推荐阅读指数」 ⭐️⭐️⭐️⭐️⭐️
  4. 逻辑运算 「推荐阅读指数」 ⭐️⭐️⭐️

好了,天不早了,干点正事哇。


C/Java/JavaScript等高级语言编写的程序中,「数值」「字符串」「图像」在计算机内部都是以「二进制数值」的形式来表现的

用二进制数表示计算机信息的原因

计算机内部是由IC这种电子部件构成的。IC的所有「引脚」,只有「直流电压」0V5V两个状态。

也就是说,IC的一个引脚,「只能表示两个状态」

IC的这个特性,决定了计算机的信息数据只能用二进制数来处理。由于1位(一个引脚)只能表示两个状态,所以二进制的计数方式就变成了011011100...这种形式。

计算机处理信息的「最小单位」--「位」,就相当于二进制中的一位。

IC的一个引脚表示二进制的1位

二进制的位数一般是8位、16位、32位····「也就是8的倍数」,这是因为计算机所处理的信息的「基本单位」是8位二进制数。8位二进制数被称为一个「字节」

字节是最基本的「信息计量单位」

  • 「位」是最小单位
  • 「字节」是基本单位

内存和磁盘都使用「字节单位」来存储和读写数据,使用「位单位」则无法读写数据。

用字节单位处理数据时,如果数字小于存储数据的字节数(=二进制数的位数),那么高位上就「用0填补」。例如,100111这个6位二进制数,用8位(=1字节)表示时为00100111

在程序中,即使是用「十进制」「文字」等记录信息,在「编译」后也会转换成二进制的值。


对于用二进制数表示的信息,计算机不会区分它是数值、文字,还是某种图片的模式,而是「根据编写程序的各位对计算机发出的指示进行信息的处理」

例如,00100111这样的二进制数,即可以将其当做「数值」做加法运算,也可以当成(单引号)文字而显示在显示器上。

具体进行何种处理,取决于「程序的编写方式」


什么是二进制

二进制数的值换成十进制数的值,只需将二进制的各「数位」的值和「位权」相乘,然后将相乘的结果相加即可。


位权

十进制数39的各个「数位」的数值,并不只是简单的39

  • 3表示的是 3×10=30
  • 9表示的是 9×1=9

这里的各个「数位」的数值相乘的101就是「位权」。数字的位数不同,位权也不一样。

  • 第一位( 最右边的一位)是 10的0次幂(=1)
  • 第二位是 10的1次幂(=10)
  • 第三位是 10的2次幂(=100)
  • 以此类推

「位权」的思考方式同样适用于二进制

  • 第一位是 2的0次幂(=1)
  • 第二位是 2的1次幂(=2)
  • 第三位是 2的2次幂(=4)
  • 以此类推

〇〇的xx次幂」表示位权,

  • 其中,十进制数的情况下 〇〇部分是 10,二进制数的情况下则为 2〇〇被称为 「基数」
  • xx,在任何进制数中都是 「数的位数-1」

    • 即第一位是 1-1=0次幂
    • 第二位是 2-1=1次幂
    • 第三位是 3-1=2次幂

数值,表示的就是构成数值的各「数位」的数值和「位权」相乘后相加的结果

二进制数00100111用十进制数表示的话是39,因为(0×128)+(0×64)+(1×32)+(0×16)+(0×8)+(1×4)+(1×2)+(1×1)= 39


移位运算和乘除运算的关系

和十进制数一样,「四则运算」同样也可以使用在二进制数中,只要注意「逢二进位」即可。

移位运算

「移位运算」指的是将二进制数值的各数位进行「左右移位」的运算。

移位有「左移」向高位方向)和「右移」向低位方向)两种。

假设存在如下处理。把变量a中保存的十进制数值39左移两位后再将运算结果存储到变量b中。

a = 39;b = a<<2;

<<这个运算符表示「左移」「右移」时用>>运算符。<<运算符和>>运算符的「左侧」「被移位的值」「右侧」表示要移位的「位数」

在前面我们介绍过,无论程序中使用的是几进制,计算机内部都会将其准换成二进制数来处理,因此都能进行「移位操作」

针对「左移运算」,空出来的低位要进行「补0操作」

而右移操作,由于情况特殊,我们后面再做详细介绍。

此外,移位操作使最高位或最低位「溢出」的数字,直接丢弃就可以了。

下图,就是上述代码的运行过程。

「移位运算」就好比使用二进制表示的「图片模式」像霓虹灯一样「左右流动」的样子


补数

二进制数中表示「负数」值时,一般会把「最高位作为符号来使用」,因此我们把这个最高位称为「符号位」

  • 符号位是 0时表示正数
  • 符号位是 1时表示负数

计算机在做减法运算时,实际上内部是在「加法运算」。在表示负数时就需要使用「二进制的补数」

补数就是「用正数来表示负数」

为了能获取补数,需要「将二进制数的各位的数值全部取反,然后再将结果加1」

例如,用8位二进制数表示-1时,只需要求得1,也就是00000001的补数即可。

  • 将各数位的0取反加1,1取反成0
  • 再将取反的结果加1
  • 最后转化成 11111111

图例如下:

1-1在计算机内部是如何实现的

1-1,也就是1+(-1),一眼就能知道答案,结果是0。

通过上文我们得知,-1用二进制表示为11111111。那么,在计算机内部计算1-1,就变成了。

00000001 + 11111111

结果确实为0(=00000000)。这个运算过程中出现了「最高位溢出」的情况,「对于溢出的位,计算机会直接忽略掉」

即在8位的范围内进行计算时候,100000000这个9位二进制数就会被认为是00000000这一8位二进制数。


补数求解的变换方法就是「取反加1」

将二进制数的值取反加1的结果,和原来的值相加,结果为0


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

右移有移位后在最高位补0和补1两种情况。当二进制数的值表示「图形模式」而非数值时候,移位后需要在最高位补0。 这就称为「逻辑右移」


将二进制数作为「带符号的数值」进行运算时,移位后要在最高位填充「移位前」符号位的值(01)。这就称为「算术右移」

  • 如果数值是用补数表示的负数值,那么右移后再空出来的最高位补1
  • 如果是正数,只需要在最高位补0即可

只有在「右移」时才必须区分「逻辑位移」「算术位移」


左移时,无论是「图形模式」逻辑左移)还是「相乘运算」算术左移),都只需要在空出来的「低位补0」即可。

符号扩充

以8位二进制数为例,「符号扩充」就是指在保存值不变的前提下将其准换成16位和32位的二进制。

不管是正数还是用补数表示的负数,都只需要「用符号位的值(0或1)填充高位」即可。


逻辑运算

在运算中,与逻辑相对的术语是算术。

  • 将二进制数表示的信息作为 「四则运算」的数值来处理就是 「算术」
  • 像图形模式,将数值处理为单纯的 01的罗列就是 「逻辑」

计算机能处理的运算,大体可分为「算术运算」「逻辑运算」

  • 「算术运算」是指加减乘除四则运算
  • 「逻辑运算」是指对二进制数 「各数字位的01分别进行处理」的运算

    • 逻辑 「非」NOT运算)
    • 逻辑 「与」( AND运算)
    • 逻辑 「或」OR运行)
    • 逻辑 「异或」XOR运算)

「逻辑非」是指的是0变成11变成0的取反操作。

「逻辑与」指的是”两个都是1“时,运算结果为1,其他情况下运算结果都为0的运算。

逻辑与的真值表

「逻辑或」指的是”至少有一方是1“时,运算结果为1,其他情况下运算结果都是0的运算

逻辑或的真值表

「逻辑异或」指的是排斥相同数值的运算。“两个数值不同”,也就是说,当“其中一方是1,另一方是0“时运算结果是1,其他情况下结果都是0.

逻辑异或的真值表

在进行逻辑运算时,都是对相对应的「各数位」分别进行运算

「大家不要把二进制数表示的值当作数值,而应该把它看作是图形或者开关上的ON/OFF」。并且,「逻辑运算」的运算对象不是数值,因此不会出现进位的情况。

下图表示的是对NI的两个字母的图形模式进行各种「逻辑运算」后的结果。假设白色部分表示1,黑色部分表示0.


后记

「分享是一种态度」

参考资料:《程序是怎样跑起来的》

「全文完,既然看到这里了,如果觉得不错,随手点个赞和“在看”吧。」


本文由 mdnice 多平台发布

计算机底层知识之二进制相关推荐

  1. 计算机底层知识之内存

    ❝ 渔夫出海前,并不知道鱼在哪里,可是他们还是选择出发, 因为他们相信,一定会满载而归.人生很多时候,是「选择了才有机会,是相信了才有可能」. -- 「稻盛和夫」 ❞ 大家好,我是「柒八九」. 今天, ...

  2. 生猛!这篇万字长文,一下子把计算机底层知识说明白了!

    点击上方"码农突围",马上关注 这里是码农充电第一站,回复"666",获取一份专属大礼包 真爱,请设置"星标"或点个"在看&quo ...

  3. 一网打尽:Java 程序员必须了解的计算机底层知识!

    公众号后台回复"面试",获取精品学习资料 扫描下方海报了解专栏详情 本文来自公众号读者cxuan的投稿 我们每个程序员或许都有一个梦,那就是成为大牛,我们或许都沉浸在各种框架中,以 ...

  4. 计算机底层知识之CPU

    ❝ Only the disciplined in life are free. 唯自律者得自由 ❞ 大家好,我是「柒八九」. 想必能看到这篇文章的小朋友,大都是有一定编程能力的「程序媛.程序猿」.无 ...

  5. 计算机基础知识之二进制ppt,计算机基础二进制.ppt

    计算机基础二进制.ppt (23页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.90 积分 内容:基本制作制作人:时宽飞数学建模协会PPT制作交流D ...

  6. 计算机底层知识——二进制之间的加减乘除运算

    本篇带你了解机器语言--二进制,位运算以及二进制之间到底是怎么进行**加减乘除**运算. 目录 1.二进制 2.数据宽度 3.有符号数.无符号数 3.1.无符号数规则 3.2.有符号数规则 4.原码反 ...

  7. Java程序员需要掌握的计算机底层知识(三):进程、线程、纤程、中断

    面试高频问题 问:进程和线程有什么区别? 答:进程是一个程序运行起来的状态(运行态),线程是一个进程中不同的执行路径(线程只是其中一个). 更为专业的回答:进程是操作系统用来分配资源的基本单位,线程是 ...

  8. Java程序员需要掌握的计算机底层知识(一):CPU基本组成、指令乱序执行、合并写技术、非同一访问内存 NUMA

    一些书籍 读书的原则:不求甚解,观其大略 你如果进到庐山里头,二话不说,蹲下头来,弯下腰,就对着某棵树某棵小草猛研究而不是说先把庐山的整体脉络跟那研究清楚了,那么你的学习方法肯定效率巨低而且特别痛苦, ...

  9. Java程序员需要掌握的计算机底层知识(五):内核同步方法

    内核同步机制 关于同步理论的一些基本概念 临界区(critical area): 访问或操作共享数据的代码段 简单理解:synchronized大括号中部分(原子性) 竞争条件(race condit ...

最新文章

  1. 前端解密后台加密算法优化思想
  2. Android通过广播实现强制下线功能
  3. linux修改windows注册表,妙招:让修改的注册表立即生效的几种方法
  4. 3.10 十进制转换为二进制
  5. WINCE6开机进度条
  6. linux安装自带mysql吗_Linux下安装mysql
  7. LeetCode 31. Next Permutation
  8. AxonFramework,存储库
  9. Spring Boot学习总结(7)——SpringBoot之于Spring优势
  10. 使用WUCDCreator将SCSI、RAID、SATA、SAS驱动程序集成到光盘中
  11. 二进制转格雷码c语言编程,格雷码简介及格雷码与二进制的转换程序
  12. [数值计算-2]:数值计算算法好坏的判断标准
  13. aws80端口不能访问的问题
  14. centos7下多播路由器安装及配置
  15. 任正非:无法退休的老人
  16. [简单逆向]某直播APP 收费直播链接获取-AES解密
  17. linux中audit服务,linux下的audit服务
  18. 大数据开发涉及到的关键技术有哪些?
  19. ASP.NET Core环境Web Audio API+SingalR+微软语音服务实现web实时语音识别
  20. PowerBI实用技巧:案例四(实现复杂动态矩阵TOPN and Others 排名分类)

热门文章

  1. RecyclerView局部刷新
  2. 数学之美:牛顿-拉夫逊迭代法原理及其实现
  3. 2017c语言 形成性考核,(2017年电大)《c语言程序设计》形成性考核作业()解答.doc...
  4. js中输出html代码怎么写,JavaScript输出语句
  5. c语言如何在1序号方编程,《基于ZG211使用C语言编程的电子钟显示设计最终版》...
  6. 廉洁文化 计算机学院,计算机学院“廉洁在志·系列作品”征集活动评选结果
  7. DNS Client服务说明
  8. 颜色空间/格式转换:HSL-RGB
  9. 产品良品率测试领域的方法统计与未来细分发展
  10. ubuntu14.04命令大全