码个蛋(codeegg)第 592 次推文

作者:HuYounger

博客:http://rkhcy.github.io/2019/03/12/binary/?utm_source=androidweekly.io&utm_medium=website

什么是二进制

二进制是一套计数方法,每个位置上的数有 2 种可能(0 - 1);二进制是计算机的执行语言,但是早在计算机出现前就存在这套计数方法,最早可追溯到古埃及。在日常生活中,我们使用的是十进制,每个位置上的数有 10 种可能(0 - 9),在了解二进制前,先看下十进制是如何运作的。

如十进制下的 101;这里有两个 1 ,代表不同的含义,左边的代表 100 ,右边的代表 1 ,因为左边的 1 在百位,而右边的 1 在个位,同理,中间的 0 在十位。所以十进制的 101 是 “ 百位为 1 ,十位为 0 ,个位为 1 ”,这里的位数对应的是 10 的幂:

二进制的位数对应的是 2 的幂:

所以二进制下的 101 代表 5。下图是二进制的前十位:

二进制转换

计算机运行的是二进制,但是我们在键盘上输入的并非二进制的内容,而是字母、数字(十进制)、汉字等,那计算机是怎么知道把这些内容转成二进制呢?计算机是人设计的,在了解计算机将我们输入的内容转成二进制前,先简单看下十进制和二进制的转换。这里的套路是:

  1. 算出 2 的 n 次幂不大于要表示的值;

  2. 用要表示的值减去 2的 n 次方,得到剩下的值后,重复步骤 1,直到最后剩下 0 为止。

举个例子,十进制的 107 如何转成二进制,先找出 2 的 n 次幂不大于 107 ,算得 n = 6,用 107 减去 2的6次方 得到 43;重复下来后 :

如果该位用到,用 1 表示,否则用 0 表示。所以 107 用二进制表示为:01101011

二进制转成十进制就是相反的过程,如 01011001 转成十进制:

什么是比特

计算机拥有数十亿超小型的数字电路,这些电路由开关组成,并且开关的状态只有开或关,分别代表二进制中的 1 和 0 。回想那些年我们逃过的数字电路课,依稀记得当时通过调节其中部分电路开关,决定是否让电流通过,可以看到对应开关上的红灯是否被点亮。

计算机中最小的存储单位是二进制位(binary digit),也叫比特, bit 只能够存储 0 或 1 ;而要存储额外的信息(如更大的十进制数),计算机通过串联这些 bit 来完成。这正是它牛逼的地方,只要开关足够多,它可以通过这些 0 和 1 代表任何内容。由 8 bit 串联组成的称为字节(byte),1 个字节可以代表 256 种不同的可能(2的8次方),2 个字节可以代表 65,536 种不同的可能(2的16次方),而这只需要 16 个开关 …

内存是怎么工作的

计算机运行的二进制存储在内存当中,这里的内存英文是 random access memory (RAM) ,那么它的结构是怎样的呢?可以把内存想象成一个大的书架,这个书架有几十亿层 … 每一层都有编号,把每一层的编号称为地址,每一层有 8 个 bit 用来存储数据。如下:

同时,有一个用于执行内存操作的处理器和内存控制器,内存控制器负责接收处理器的指令,对内存执行读写操作,它可以直接操作内存这个大书架的的每一层,如下:

这里的直接操作有多屌?它意味着我们可以先访问 0 号地址的数据,然后直接访问 12345 号的数据,而不需要在 RAM 这个大书架中挨个寻址到 12345 号。这也是random access memory (RAM)这个名字的由来 — “ 立即访问内存的中随机地址”

虽然内存控制器能够在相隔很远的内存地址间快速切换,但是它还是倾向于访问相邻的地址的内存,计算机在这方面做了优化。处理器有一个缓存用来保存最近从 RAM 中访问的数据的副本,如下:

处理器从缓存中读取数据的速度快于 RAM ,因此缓存的出现有助于我们节省时间。当处理器下达指令要内存处理器去访问某个内存地址时,内存处理器其实还把要访问地址的相邻地址的内容一起返回给处理器,处理器把这些内容存储在缓存中。

假如处理器想按顺序,先后访问地址 951、952、953、954 … 在第一次读取地址 951 时就会把所需的内容全部取出来放到处理器的缓存中,之后 952 、953、954 的读取则是通过快速的缓存读取方式获得。

但是假如处理器先后访问的地址是 951、321、146 … 那此时的缓存就帮不上忙了,内存管理器每次都得老老实实的去 RAM 区获取数据,当然速度就会比上面的慢了。

二进制表示数字

上面我们已经知道如何用二进制表示十进制,日常生活中使用的数字范围在在计算机中可以用 4 或 8 个字节(32 或 64 bit)来表示:

  • 4 比特可以表示的数字范围:2147483648 ~ 2147483647

  • 8 比特可以表示的数字范围:9223372036854775808 ~ 9223372036854775807

二进制还可以用来表示分数、小数、负数:

  • 分数:分别储存两个数:分子和分母

  • 小数:分别存储两个数:去掉小数点后的数字;小数点出现的位置

  • 负数:二进制位中最左边的那一位代表符号,0 表示正数,1 表示负数;

二进制表示字符

了解了计算机如何用二进制表达数字(十进制),那么计算机如何用二进制表达字符呢?计算机用到了编码(encoding)。编码就是一套数字和字符间的映射关系,有许多不同的编码格式,举个常用的例子: ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)。ASCII 编码表可以翻译数字、大小写字母、以及常用的一些特殊符号,有了这套规则,计算机就知道如何应对我们输入的内容了:

假设我们输入的内容为 NICE ,通过 ASCII 编码表首先转化成十进制为:

78 73 67 69

再转成二进制:

01001110 01001001 01000011 01000101

观察上面这个例子发现

  • 一个字符需要 8 bit 来表示,也就是 1 byte

  • 二进制表示字母都以 0 开头

看起来只需要 7 bit 就能表达一个字符,第一个 bit 总是 0 ,给人的感觉好像是浪费了 1 bit,那么当初设计这个表的时候难道没发现这个 bug 么?再看一眼上面的 ASCII 表,我们发现表中缺了很多其他特殊符号,如 é、æ 等等,这些符号计算机要怎么用二进制表达呢?最初设计的 ASCII 编码表只用到了 7 bit ,因此有 128 种可能,再把第一位利用起来,ASCII 编码表就得以翻倍扩展。

还有其他方式可以对字符编码,例如 Unicode 编码表,可以用来表达世界上各个国家的字符,区别在于每个字符占用 2 个 byte(这样理论上一共最多可以表示 2的16次方(即 65536 )个字符。基本满足各种语言的使用。实际上当前版本的 Unicode 码并未完全使用这 16 位编码,而是保留了大量空间以作为特殊使用或将来扩展)。这些编码的核心思想是一致的:建立一套规则作为抽象层,用来简化我们在字符和二进制之间的转化方式。

近期文章:

  • Python之父再度为996发声,而我们呢?

  • Flutter 入门指北之常用布局

  • 程序员写墓志铭……

今日问题:

你还记得二进制吗?

在码个蛋(codeegg)后台回复「社群」即可加入学习群

你在看吗?

二进制差分码规则_二进制 你不知道的事相关推荐

  1. 二进制差分码规则_一篇文章弄明白Node.js与二进制数据流

    1 认识二进制数据 二进制是计算技术中广泛采用的一种数制.二进制数据是用0和1两个数码来表示的数.它的基数为2,进位规则是"逢二进一",借位规则是"借一当二", ...

  2. 二进制补码乘法除法_二进制乘法和除法

    二进制补码乘法除法 1)二进制乘法 (1) Binary Multiplication) Binary numbers can be multiplied using two methods, 二进制 ...

  3. java二进制转十进制代码_二进制转十进制java代码

    二进制转十进制java代码 Java有两种方法可以将二进制数转换为十进制数: 1)使用Integer类的Integer.parseInt()方法. 2)自己编写转换逻辑. 方法1:使用Integer. ...

  4. 二进制十进制十六进制转换_二进制数制到十进制数制的转换

    二进制十进制十六进制转换 Prerequisite: Number systems 先决条件: 数字系统 To convert binary number to its respective deci ...

  5. 二进制转换八进制图解_二进制、八进制和十六进制之间转换详解

    我们平时使用的数字都是由 0~9 共十个数字组成的,例如 1.9.10.297.952 等,一个数字最多能表示九,如果要表示十.十一.二十九.一百等,就需要多个数字组合起来. 例如表示 5+8 的结果 ...

  6. java 只有日期的类_【你不知道的事系列】Java中处理日期的类

    Java中提供了一系列用于处理日期.时间的类,包括创建日期,时间对象,获取系统当前日期,时间等操作 Date类: 位于java.util.Date,从JDK1.0起就存在了,但现在它的大部分构造器,方 ...

  7. 单片机中如何将BCD码拆开_单片机二进制BCD码转换实验程序流程图

    二进制BCD码转换 一.实验目的 1.掌握简单的数值转换算法 2.基本了解数值的各种表达方法 二.实验说明 单片机中的数值有各种表达方式,这是单片机的基础.掌握各种数制之间的转换是一种基本功.我们将给 ...

  8. 两数之差的补码等于被减数的补码与减数相反数的补码。_二进制的原码、反码、补码...

    一.十进制与二进制的相互转换 1. 十进制转换为二进制,分为整数部分和小数部分. 整数部分采用除2倒取余法,具体做法:用2去除十进制整数,可以得到一个商和余数:在用2去除商,又会得到一个商和余数,如此 ...

  9. linux 二进制差分工具,打造Android万能的软件更新库

    今日科技快讯 阿里星球今天在苹果商店发布的更新动态显示,其将在近期停止APP内的音乐服务,用户可以通过新版本内的指引和说明,导出本地音乐.这意味着上线八个月后,阿里星球做出了一个重大决定:停止音乐服务 ...

  10. 计算机组成原理二进制地址码,计算机组成原理第四章第三讲.ppt

    计算机组成原理第四章第三讲 第四章 存储器;存储器概述分类层次结构主存储器概述半导体存储芯片静态随机存储器动态随机存储器只读存储器存储器与CPU的连接存储器的校验提高访存速度的措施; 高位字节 地址为 ...

最新文章

  1. 面试官问:生成订单30分钟未支付,则自动取消,该怎么实现?
  2. 求职Python开发,面试官最喜欢问的几个问题
  3. php进程守护进程,php 多进程实现守护进程的实例代码
  4. DijKstra算法普通+堆优化链式向前星
  5. reducebykeyandwindow java_Spark Streaming笔记整理(三):DS的transformation与output操作
  6. 统计指定目录下的视频时长
  7. 高可用服务 AHAS 在消息队列 MQ 削峰填谷场景下的应用...
  8. Factorization Machine 1
  9. ethtool查看网卡以及修改网卡配置
  10. 超详细的测试理论基础知识
  11. 浅析内网即时通讯工具的安全性如何
  12. PS快捷键总结,(操作、设置)小技巧
  13. 别错过这张AI商用清单:你的生产难题可能被一个应用解决!
  14. 第九十六章 SQL函数 MOD
  15. Mac配置iTem2主题、字体、颜色
  16. 2022年手机CPU性能天梯图排行榜 手机处理器排行榜 2022
  17. 什么是pisa测试_PISA测试是什么?
  18. vue延迟渲染组件_Vue 动态组件渲染问题分析
  19. android 截屏 简书,Android 内置应用截屏方法
  20. 关于软件界面设计、控件颜色搭配、一些实用建议(偷懒技巧)总结——针对C# WinForm/WPF技术

热门文章

  1. Activities
  2. 第四章表单与文件-笔记-验证
  3. 在春天,我用秋来诱惑你
  4. 新版Windows Live SkyDrive Beta发布
  5. POJ 2686 Traveling by Stagecoach 壮压DP
  6. 【BZOJ5338】[TJOI2018]异或(主席树)
  7. 广播BroadcastReceiver(2)
  8. maven中常遇到的一些错误
  9. 【GNN】图表示学习Graph Embedding综述
  10. 【BERT】源码分析(PART II)