计算机为什么用二进制?


熟悉编程的人都知道二进制总是一个让人晦涩难懂的词汇,只有大神级的程序员才有资格把玩它。 我们今天来重新认识一下二进制,了解编程中的数学知识和计算机为什么使用二进制?

先聊聊十进制

我们平时使用的是10进制计数法。

上面的规则我们在小学数学都学过了,日常生活中也一直在用,是众所周知的常识。 在此权当复习,下面我们将通过实例来了解一下10进制计数法。

分解1024

首先,我们以 1024 这个数为例。1024表示的是由 1、0、2、4 这4个数字组成的一个称作 1024 的数(你这不废话)。

1024

这样并排的数字,因数位不同而意义相异。

综上所述,1024 这个数是1个1000、0个100、2个10和4个1累加的结果。用数字和语言来冗长地说明有些无趣,下面就用图示来表现。

\[ 1x1000 + 0x100 + 2x10 + 4x1 \]

如图,将数字的字体大小加以区别,各个数位上的数字 1、0、2、4 的意义便显而易见了。1000是 10x10x10,即\(10^3\)(10的3次方),100是 10x10,即\(10^2\)(10的2次方)。因此,也可以写成如下形式(请注意箭头所示部分)。

\[ 2x10^3 + 5x10^2 + 0x10 + 3x1 \]

再则,10是 \(10^1\)(10的1次方),1是 \(10^0\)(10的0次方),所以还可以写成如下形式。

\[ 2x10^3 + 5x10^2 + 0x10^1 + 3x10^0 \]

千位、百位、十位、个位,分别可称作 \(10^3\)的位、\(10^2\)的位、\(10^1\)的位、\(10^0\)的位。 10制计数法的数位全都是\(10^n\)的形式。这个10称作10进制计数法的基数

基数 10右上角的数字——指数,是 3、2、1、0 这样有规律地顺次排列的,这点请记住。

\[ 2x10^3 + 5x10^2 + 0x10^1 + 3x10^0 \]

二进制计数法

计算机在处理数据时使用的是2进制计数法。从10进制计数法类推,便可很快掌握它的规则。

用2进制计数法来数数,首先是0,然后是1,接下去···不是2,而是在1上面进位变成10,继而是11,100,101……

下面的表格展示了0到79的数的10进制计数法和2进制计数法。

10进制2进制10进制2进制10进制2进制10进制2进制
0020101004010100060111100
1121101014110100161111101
21022101104210101062111110
31123101114310101163111111
4100241100044101100641000000
5101251100145101101651000001
6110261101046101110661000010
7111271101147101111671000011
81000281110048110000681000100
91001291110149110001691000101
101010301111050110010701000110
111010311111151110011711000111
1211003210000052110100721001000
1311013310000153110101731001001
1411103410001054110110741001010
1511113510001155110111751001011
16100003610010056110111761001100
17100013710010157111001771001101
18100103810011058111010781001110
19100113910011159111011791001111

分解1100

在此,我们以2进制表示的1100 (2 进制数的 1100) 为例来探其究竟。

1100

和10进制计数法一样,并排的数字,各个数位都有不同的意义。从左往右依次为:

也就是说,2进制的1100是1个8、1个4、0个2和0个1累加的结果。这里出现的8、4、2、1,分别表示 \(2^3\)\(2^2\)\(2^1\)\(2^0\) 即2进制计数法的1100,表示如下意思。

\[ 1x2^3 + 1x2^2 + 0x2^1 + 0x2^0 \]

这样计算就能将2进制计数法的1100转换为10进制计数法。

\[ 1 x 2^3 + 1 x 2^2 + 0 x 2^1 + 0 x 2^0 = 1 x 8 + 1 x 4 + 0 x 2 + 0 x 1 \\\qquad\qquad\qquad\;\,= 8 + 4 + 0 + 0 \\\qquad\;\,= 12 \]

由此可以得出,2进制的1100若用10进制计数法来表示,则为12。

基数转换

接下来我们试着将10进制的12转换为2进制。这需要将12反复地除以2(12除以2,商为6; 6再除以2,商为3; 3再除以2……),并观察余数为 “1” 还是 “0”。余数为0则表示“除完了”。随后再将每步所得的余数的列(1和0的列)逆向排列,由此就得到2进制表示了。

12 / 2 = 6 (余0)
6  / 2 = 3 (余0)
3  / 2 = 1 (余1)
1  / 2 = 0 (余1)

那么10进制的12转换为二进制就是 1100。同样我们试将10进制的1024转换为2进制计数法。

1024 / 2 = 512 (余0)
512  / 2 = 256 (余0)
256  / 2 = 128 (余0)
128  / 2 = 64  (余0)
64   / 2 = 32  (余0)
32   / 2 = 16  (余0)
16   / 2 = 8   (余0)
8    / 2 = 4   (余0)
4    / 2 = 2   (余0)
2    / 2 = 1   (余0)
1    / 2 = 0   (余1)

可以知道1024用2进制表示为 10000000000。各个数位的权重如下:

\[ 1x2^11 + 0x2^10 + 0x2^9 + 0x2^8 + 1x2^7 + 1x2^6 + 0x2^5 + 0x2^4 + 0x2^3 + 1x2^2 + 1x2^1 + 1x2^0 \]

在 10进制中,基数为10,各个数位是以 \(10^n\) 的形式表现的。而2进制中,基数为2, 各个数位是以 \(2^n\) 的形式表现的。从10进制计数法转换为2进制计数法,称作10进制至2进制的基数转换

计算机中为什么采用2进制计数法

计算机中一般釆用2进制计数法,我们来思考一下原因。计算机是由逻辑电路组成的,电路中通常只有两个状态,开关的接通和断开, 这两种状态正好可以用“1”和“0”表示。计算机在表示数的时候,会使用以下两种状态。

虽说是开关,但实际上并不需要机械部件。总之,它能够形成两种状态,这两种状态,分别对应0和1这两个数字。

1个开关可以用0或1来表示,如果有许多开关,就可以表示为许多个0或1。你可以想象这里排列着许多开关,各个开关分别表示2进制中的各个数位。这样一来,只要增加开关的个数,不管是多大的数字都能表示出来。

电脑的基层部件是由集成电路组成的,这些集成电路可以看成是一个个门电路组成,(当然事实上没有这么简单的)。当计算机工作的时候,电路通电工作,于是每个输出端就有了电压。电压的高低通过模数转换即转换成了二进制:高电平是由1表示,低电平由0表示。也就是说将模拟路转换成为数字电路。这里的高电平与低电平可以人为确定,一般地,2.5伏以下即为低电平,3.2伏以上为高电平。

电子计算机能以极高速度进行信息处理和加工,包括数据处理和加工,而且有极大的信息存储能力。数据在计算机中以器件的物理状态表示,采用二进制数字系统,计算机处理所有的字符或符号也要用二进制编码来表示。

当然,做成能够表示0〜9这10种状态的开关,进而让计算机釆用10进制计数法,这在理论上也是可能的。但是,与0和1的开关相比,必定有更为复杂的结构。

另外,请比较一下面表格所示的加法表。2进制的表比10进制的表简单得多吧。若要做成1位加法的电路,采用2进制要比10进制更为简便。

10进制加法表

+0123456789
00123456789
112345678910
2234567891011
33456789101112
445678910111213
5567891011121314
66789101112131415
778910111213141516
8891011121314151617
99101112131415161718

2进制加法表

+01
001
1110

不过,比起10进制,2进制的位数会增加许多,这是它的缺点。例如在10进制中2503只有4位,而在2进制中要表达同样的数则需要100111000111共12位数字。这点从表1-2中也显而易见。

人们觉得10进制比2进制更容易处理,是因为10进制计数法的位数少,计算起来不容易发生错误。此外,比起2进制,釆用10进制能够简单地通过直觉判断出数值的大小。人的两手加起来共有10个指头,这也是10进制更容易理解的原因之一。

不过,因为计算机的计算速度非常快,位数再多也没有关系。而且计算机不会像人类 那样发生计算错误,’ 不需要靠直觉把握数字的大小。对于计算机来说,处理的数字种类少、 计算规则简单就最好不过了。

让我们来总结一下。

鉴于上述原因,计算机釆用了2进制计数法。 人类使用10进制计数法,而计算机使用2进制计数法,因此计算机在执行人类发出的任务时,会进行10进制和2进制间的转换。计算机先将10进制转换为2进制,用2进制进行计算,再将所得的2进制计算结果转换为10进制。

按位计数法

什么是按位计数法

我们学习了10进制和2进制两种计数法,这些方法一般称作按位计数法。除了10进制和2进制以外,还有许多种类的按位计数法。在编程中,也常常使用8进制和16进制计数法。

8进制计数法

8进制计数法的特征如下:

16进制计数法

16进制计数法的特征如下:

在16进制计数法中,使用A、B、C、D、E、F (有时也使用小写字母a、b、c、d、e、f) 来表示10以上的数字。

N进制计数法

一般来说,N进制计数法的特征如下:

例如,N 进制计数法中,4位数 \(a_3a_2a_1a_0\)

\[ a_3xN^3 + a_2xN^2 + a_1xN^1 + a_0xN^0\qquad(a_3、a_2、a_1、a_0是0〜N-1中的数字) \]

总结

二进制的优点

  1. 技术实现简单,计算机是由逻辑电路组成,逻辑电路通常只有两个状态,开关的接通与断开,这两种状态正好可以用“1”和“0”表示。
  2. 简化运算规则:两个二进制数和、积运算组合各有三种,运算规则简单,有利于简化计算机内部结构,提高运算速度。
  3. 适合逻辑运算:逻辑代数是逻辑运算的理论依据,二进制只有两个数码,正好与逻辑代数中的“真”和“假”相吻合。
  4. 易于进行转换,二进制与十进制数易于互相转换。
  5. 用二进制表示数据具有抗干扰能力强,可靠性高等优点。因为每位数据只有高低两个状态,当受到一定程度的干扰时,仍能可靠地分辨出它是高还是低。

资料

  #二进制 

« 可爱的 Netty 之开篇 Golang 中该使用指针类型还是值类型? »
blog comments powered by Disqus