进制的细节-从滴~滴滴~到0xFF

        书接上回,上一次通过硬盘容量表示之迷,引申出了位、字节、进制等概念。还不熟悉的,请翻看我前面的文章吧。

小小零和壹-蕴含大信息

        今天想跟大家重点聊聊进制。

        为什么计算机要用二进制?因为要适应现代计算机的“特性”,1个位里就存两种信息0和1,对于电路尤其是数字电路来说,也就是导通和中断。从人的逻辑思维来理解0和1正好对应逻辑(也称布尔BOOL)“真、假”。

        1个位能表达的信息量实在是太少了,聪明的各位一定想到了,没错,增加位就行了。比如2个位的组合,就有00  01 10 11这四种,就能表示4种信息了。1位信息就像老式的黑白电视机,只有黑、白两种信息,2位的话,终于有了颜色了,00 01 10 11可以对应红黄蓝绿四种颜色。那么3个位呢?000 001 010 011 100 101 110 111,变成8种信息了,对应的颜色就更多了,甚至除了赤橙黄绿青蓝紫七种颜色,还可以多存一位黑或者白的信息了。

        现在加到4个位,能表达的信息就更多了,16种了。那么1个字节(一个大B)可以表示多少种信息呢?答案是0-255也就是256种信息。

        有朋友可能会问,256种也不是很多啊,离真正的日常生活差着十万八千里呢吧?

        但别忘记,我们人类也是有文字系统的,比如符号字母相对较少的英语,不过就26个字母,加上大小写的变化,翻倍也不过就54个“状态”。阿拉伯数字0-9又占了10个,加上各种标点符号,运算符号,256种信息是绰绰有余了。

        比如用(0011 0000)B这个状态表示数字“0”,那么(0011 1001)B 就表示阿拉伯数字“9”.这其实就是ASCII编码(American Standard Code for Information Interchange 美国信息交换标准代码)的基本原理。

        其实,只利用0和1的组合,早在计算机被发明以前,人们已经学会利用了,比如最经典的摩尔斯电码,就是利用长短不同的“滴”对应0、1的特性,从而传递信息的一种编码。

大名鼎鼎的摩尔斯电码表

        大家都比较熟知的SOS信号,对照上面的摩尔斯电码来看,就是三短-->三长-->三短

        有了以上的基础了解,又会引出个问题:

        无论是输入还是输出,二进制表示信息的方法,对于计算机来说是简单了,可对于人来说太痛苦了。

        比如要输入“HELLO”给计算机,怎么告诉计算机呢?最早的解决方案确实是简单粗暴,通过光学和打孔的方式,当有光穿过孔,就表示“1”,说明是通的,没打孔的区域光穿不过去,就是“0”。但是人去打孔可就麻烦大了,一个字节8个定位孔,要精确的定位,不能开错了任何一个孔的位置,5个“字母”就是40个孔,那如果要输入个毕加索的全名呢?这还是没考虑我们的中文,更为复杂,1个字节256个信息,显然是放不下成千上万个汉字的情况呢?

        从输出的角度来说,好容易打孔输入了一些信息给计算机,经过计算与处理后,计算机某5个字节,给出的结果信息是01101000 01100101 01101100 01101100 01101111 (为了好看,这里我还特意在每个字节间加了空格......)

        通过上面的例子,二进制无论是输入还是输出,给人来看都实在是痛苦,毕竟计算机这种工具,是给人用的,所以出于可用性和易用性,人们就发明了进制转换和编码与解码。

        编码和解码的故事后面再说吧,这里先说说进制的转换。

进制的转换

        计算机只认识二进制的0和1,但是海量的0和1的处理,对于人来说又太容易出问题,既不容易记忆,也不容易处理,所以通常就需要进制的转换了。

常用进制和2进制幂的计算

        毕竟计算机这玩意是老外发明的,不同的进制的英文位:

序号

进制全称

简写

包含的“元素”

1

二进制:Binary  

Bin

0和1  两个元素

2

八进制:Octal

Oct

0 1 2 3 4 5 6 7  八个元素

3

十进制 Decimal

Dec

0 1 2 3 4 5 6 7 8 9 人最常用的十个元素

4

十六进制 Hexadecimal

Hex

0 1 2 3 4 5 6 7 8 9 A B C D E F 十六个元素

        计算的方式:因为计算机是二进制的,每1个比特能表示的信息是2种,所以用2的X次幂的方式来计算:2^0=1 2^1=2 2^2=4 2^3=8 2^4=16 2^5=32 2^6=64 2^7=128  这8个公式(数字),建议大家牢记。

数制的转换工具

        如果细讲计算的方法,我个人觉得意义不大,毕竟能理解进制这个概念就好。比如微软的WINDOWS自带计算器已经提供了很好用的功能:

        或者各种在线的网站,APP等等,都提供了这些最基础的数制转换的程序。

        无论哪种,其实都可以利用上面介绍的2的N次幂来算的。遵循几个原则:

        1)和人们常用的十进制一样,从右向左,位数由低-->高

        2)注意:计算机系统是从0-7组成8位,而不是人们习惯的1-8组成8位

        3)信息为”1”的位计算对应的值,最后总数相加

        4)十六进制用的是分组的方法,4个比特1组,因为人们最常用的阿拉伯数字只有10个数,不够十六进制用,于是按照英文字母的顺序,借用了A B C D E F这6个字符,A=(十进制,下同)的10  B=11 C=12 依次类推 F=15

        比如最极端的(111111111)b的计算:

        转换成十进制:128+64+32+16+8+4+2+1=255

        转换为十六进制:

        分两组 1111 1111 每组换算成16进制,每组都是8+4+2+1=15,也就是十六进制的字母F  所以整体上(11111111)b=0xFF

关于输出和写法

        因为进制的不同,比如A8 3E 这些都容易知道是十六进制的数,但是比如1100......这种信息,是二进制的壹壹零零 还是 十进制的一千一百?740 这个数字,是十进制的七百四十,还是十六进制的?这样显然会混乱的。因此,又产生了不同进制的写法问题。

        手写以及很多书籍,为了清晰的表达,通常用上面表格的首字母缩写,比如(1100)b表示二进制的壹壹零零,(1100)h表示十六进制,十进制是人类最常用的,所以一般不用标识。

        另外要注意两点:

        1)计算机编写程序,一般会用“前缀”而不是“后缀”,而且不同的编程语言,可能也不太一样,比如下面是我写的PYTHON和C语言的进制转换场景,来看看不同编程语言的进制转换的不同:

上图十PYTHON的一个示例,0b  0o  0x 分别表示不同的进制

        上图是C的一个小示例,通过两张图的对比,可以看到不同的编程语言,对于表示进制这个事情,还是有很大区别的。至于JAVA的进制转换输出是什么样子?B/S架构的各种语言,比如PHP或者JS是什么样的?有兴趣的朋友可以自行去尝试,这里不赘述了。

        2)特别要说一下八进制,这个用到的场景,相对于二、十、十六进制来说,相对要少一些。而且很多计算机的字体,字母O或者o和数字0,都是非常相像的,实际使用当中一定要注意区分。举个例子,很多人用过的经典的弱口令:Passw0rd   : )

尾声

        呼~,进制这块终于差不多收尾了。讲真,进制这块儿本来没想写太多的,但是出于个人注意细节的习惯,不知不觉就写了一大堆。进制(尤其是二进制和十六进制两种),在计算机领域真的是不能不知道的基础,所以还是花了挺大的篇幅来介绍进制的由来和表示方法。希望对各位朋友能有所帮助吧。老规矩,欢迎大家点赞评论,谢谢!

参考信息

https://blog.csdn.net/qq_38371250/article/details/129318854

  • 15
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值