Codeegg的第592条推文作者:HuYounger博客:http://rkhcy.github.io/2019/03/12/binary/?。utm _ m
Codeegg的第592条推文
作者:HuYounger
博客:http://rkhcy.github.io/2019/03/12/binary/?。utm _ medium =网站
什么是二进制?
二进制是一套计数方法,每个位置的数有两种可能(0-1);二进制是计算机的执行语言,但这种计数方法早在计算机出现之前就存在了,最早可以追溯到古埃及。在日常生活中,我们使用十进制,每个位置的数字有10种可能(0-9)。在了解二进制之前,我们先来看看十进制是如何工作的。
比如十进制的101;这里有两个1,代表不同的意思。左边的代表100,右边的代表1,因为左边的是百,而右边的是个单位。同样,中间的零是十进制的。所以十进制101是“100位数是1,10位数是0,1位数是1”,这里的位数对应的是10的幂:
二进制数字的个数对应于2的幂:
所以二进制下的 101 代表 5。下图是二进制的前十位:所以二进制的101代表5。下图显示了二进制的前十位:
二进制转换
计算机是以二进制运行的,但我们在键盘上输入的不是二进制,而是字母、数字(十进制)、汉字等。计算机是怎么知道把这些内容转换成二进制的?计算机是由人设计的。在我们知道计算机把我们输入的东西转换成二进制之前,我们先简单看一下十进制和二进制之间的转换。这里的例程是:
计算出2的n次方不大于要表示的值;
从要表示的值中减去2的n次方得到剩余值,重复步骤1,直到最后剩下0。
比如如何把十进制的107转换成二进制,先找出2的n次方不大于107,算出n = 6,用107减去2的6次方得到43;重复一遍后:
如果使用该位,则用1表示,否则用0表示。所以107用二进制表示为:01101011。
二进制到十进制是相反的过程,比如01011001到十进制:
什么是一点?
计算机有数十亿个超小型数字电路,由开关组成,开关的状态只有开或关,分别用二进制表示1和0。回想那些年我们跳过的数字电路课,依稀记得通过调整部分电路开关来决定是否让电流通过,可以看到相应开关上的红灯是否亮起。
计算机中最小的存储单位是二进制数,也叫位,只能存储0或1;为了存储额外的信息(例如一个更大的十进制数),计算机通过将这些位串联起来来完成它。这就是它令人敬畏的地方。只要有足够多的开关,就可以通过这些0和1代表任何东西。8位串联连接称为字节。一个字节可以代表256种不同的可能性(2的8次方),两个字节可以代表65536种不同的可能性(2的16次方),只需要16个开关。
记忆是如何工作的?
计算机运行的二进制存储在内存中,这里的内存英文名称是随机存取存储器(RAM),那么它的结构是怎样的呢?你可以把内存想象成一个大书架,它有几十亿层……每一层都有一个编号,每一层的编号称为一个地址,每一层有8位用于存储数据。如下所示:
同时,存在用于执行存储器操作的处理器和存储器控制器。内存控制器负责从处理器接收指令,并对内存执行读写操作。它可以直接操作内存大书架的每一层,如下:
这里的直接操作有多牛逼?意思是我们可以先访问地址0的数据,然后直接访问编号12345的数据,不用在RAM的大书架里一个一个地寻址编号12345。这也是随机存取存储器(RAM)这个名字的由来——“立即访问内存中的随机地址”。
虽然内存控制器可以在相距较远的内存地址之间快速切换,但仍然倾向于访问相邻地址的内存,计算机在这方面做了优化。处理器有一个缓存,用于存储最近从RAM访问的数据副本,如下所示:
处理器从缓存中读取数据的速度比RAM快,所以缓存的出现帮助我们节省了时间。当处理器向内存处理器发出访问某个内存地址的指令时,内存处理器实际上将该地址的相邻地址的内容返回给处理器,处理器将这些内容存储在缓存中。
如果处理器想要依次访问地址951、952、953、954…当第一次读取地址951时,所有需要的内容都会被取出并放入处理器的缓存中,然后通过快速缓存读取来获得地址952、953、954的读取。
但是如果处理器访问的地址是951,321,146……那么这个时候缓存就帮不上忙了,内存管理器每次都要老老实实的去RAM区取数据,当然速度会比上面慢。
数字的二进制表示
以上,我们已经知道如何用二进制来表示十进制,日常生活中使用的数的范围在计算机中可以用4或8个字节(32或64位)来表示:
4位可以表示的数字范围:2147483648 ~ 2147483647。
可以用8位表示的数字范围:9223372036854775808 ~ 922337203685477807
二进制也可以用来表示分数、小数和负数:
分数:分别存储两个数:分子和分母。
小数:两个数分开存储:去掉小数点后的数;小数点出现的地方
负数:二进制中最左边的位代表符号,0代表正数,1代表负数;
二进制表示字符
我理解计算机如何用二进制表示数字(十进制),那么计算机如何用二进制表示字符呢?计算机使用编码。编码是数字和字符之间的一组映射关系,有许多不同的编码格式,例如,ASCII(美国信息交换标准码)。ASCII码表可以翻译数字,大小写字母,以及一些常用的特殊符号。有了这套规则,计算机将知道如何处理我们输入的内容:
假设我们输入的内容是NICE,我们先通过ASCII编码表转换成十进制如下:
78 73 67 69
转换为二进制:
01001110 01001001 01000011 01000101
观察上面的例子,发现
一个字符需要8位来表示,也就是1个字节。
二进制意味着所有字母都以0开头。
好像表示一个字符只需要7位,第一位总是0,给人感觉是浪费1位。所以设计这个表的时候没发现这个bug吗?再看上面的ASCII表,我们发现表中遗漏了很多其他的特殊符号,比如é等等。计算机如何用二进制表示这些符号?原来设计的ASCII编码表只用了7位,所以有128种可能。通过使用第一位,ASCII编码表可以加倍和扩展。
还有其他的字符编码方式,比如Unicode编码表,可以用来表示世界各国的字符。不同的是每个字符占用2 byte(所以理论上最多能代表2的16次方(即65536个字符)。基本满足各种语言的使用。实际上,当前版本的Unicode代码并没有完全使用这种16位编码,而是保留了大量的空空格以供特殊使用或将来扩展)。这些代码的核心思想是一样的:建立一套规则作为抽象层来简化我们的字符和二进制之间的转换。
最近的文章:
Python之父再次为996发声,而我们呢?
颤振入门指的是华北常见的布局。
程序员写墓志铭…
今天的问题:
你记得二进制吗?
在codeegg后台回复“社区”即可加入学习群。
你在看吗?
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。
作者:美站资讯,如若转载,请注明出处:https://www.meizw.com/n/412478.html