65.9K
CodeProject 正在变化。 阅读更多。
Home

数值基入门

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.86/5 (3投票s)

2015年10月1日

CPOL

10分钟阅读

viewsIcon

11445

在本文中,我将通过十进制、二进制、十六进制和八进制这四种进制的示例来介绍数字进制的基础知识。

数值基入门

 

引言(十进制系统)

我们都习惯于使用十进制(decimal)系统计数——因为我们有10根手指,所以从历史上来看,这就是我们计数的方式。我想,如果我们长了另一根手指,我们方便的数字进制可能会随之改变。

令人惊讶的是,计算机根本没有手指,所以它们不习惯用我们的进制计数,当然它们也可以,但它们的设计并非如此(至少不是你日常使用的普通计算机)——这有很多原因,本文将不一一详述。

数字进制约定

数字是一个数学术语,可以用不同的进制表示,但这对数字本身没有影响,它只是表示数字的一种方式。

同样,“Bean”这个词在英语和其他语言中有不同的表示方式,但这并不会改变“Bean”这个词的含义。

Wiki

https://en.wikipedia.org/wiki/Numerical_digit

当你在处理不同进制的数字时,你需要明确指出数字的进制,以避免混淆,因为相同的图形符号可能代表完全不同的数字。

相同图形数字在不同进制下的示例

 

11 - 在十进制中表示:11

11 - 在八进制中表示:9

11 - 在十六进制中表示:17

 

在我们的日常生活中,我们默认使用十进制,因此没有必要提及进制类型。

 

十进制

在十进制(decimal)中,每个数字的位值从0到9(共10个数字)。

  • 从现在开始,当我谈论数字中某个数字的位置时,我会使用“索引”这个词(从右到左计数),而第一个索引是0(零基索引),例如:

十进制数 4687(decimal) -

数字“7”在我们十进制中的0索引位。

数字“8”在我们十进制中的第1个索引位。

数字“6”在我们十进制中的第2个索引位。

数字“4”在我们十进制中的第3个索引位。

 

  • 数字中每个数字的值是该数字乘以基数(base)的索引次幂(如果你感到困惑,别担心,我们会通过示例来解释……)。

 

让我们将数字4687(decimal)分解成它的数字。

 

7 表示 7 乘以 10 的 0 次幂 = 7 * 10 ^ 0 = 7 * 1 = 7

8 表示 8 乘以 10 的 1 次幂 = 8 * 10 ^ 1 = 8 * 10 = 80

6 表示 6 乘以 10 的 2 次幂 = 6 * 10 ^ 2 = 6 * 100 = 600

4 表示 4 乘以 10 的 3 次幂 = 4 * 10 ^ 3 = 4 * 1000 = 4000

 

结果: 4000 + 600 + 80 + 7 = 4687

十进制计数法

如果你从0开始数到10,你会得到类似这样的结果:

0,1,2,3,4,5,6,7,8,9,10

看看我们在9之后加1发生了什么?

我们开始用一个数字计数——0,然后每次我们给数字加1。

当我们的数字等于基数(10)时,发生了溢出——我们向前进位1到新的索引(第1个索引)——这使得我们的数字变为:1 * 10 + 0 * 0 = 10。

 

让我们继续计数,直到我们在十进制中设置了新的索引。

10,11,12,13,14,15,16,17,18,19,20

这里也是同样的道理:唯一的区别是,我们的第1个索引位已经有了1,所以我们在这个索引位上加1,直到得到20(十进制)——这是我们基数的幂(20 = 基数 * 2)。

20(decimal) = 2 * (10 ^ 1) + 0 * (10 ^ 1) = 20 * 10 + 0 * 10 = 20 + 0 = 20

 

另一个例子

如果我们选择另一个任意的十进制数字:12345

第一个索引范围:0 – 9

第二个索引范围:10– 19

第三个索引范围:20– 29

等等……

 

让我们再看一眼我们的数字,我们将按索引将其分解并配置数字的实际含义。

我们的数字是12345,让我们按索引分解。

5 – 第1个索引,4 – 第2个索引,3 – 第3个索引,2 – 第4个索引,1 – 第5个索引。

 

现在我们可以从数学上计算这个数字。

12345 = (5 * 10^0) + (4 *10^1) + (3 *10 ^2) + (2 *10 ^3) + (1*10 ^4) =

= (5 * 1) + (4 *10) + (3 *100) + (2 *1000) + (1*10 ^10000) = 123245

 

我们太习惯十进制数字了,以至于我们自动进行这些计算,但如果你回忆一下你最早的数学课,你可能会意识到,你就是这样做的。

 

十进制计算表
0 = 0 * (10 ^ 0)        
1 = 1 * (10 ^ 0)        
2 = 2 * (10 ^ 0)        
3 = 3 * (10 ^ 0)        
4 = 5 * (10 ^ 0)        
5 = 6 * (10 ^ 0)        
6 = 7 * (10 ^ 0)        
7 = 7 * (10 ^ 0)        
8 = 8 * (10 ^ 0)
9 = 9 * (10 ^ 0)
10 = 0 * (0 ^ 10) + 1 * (10 ^ 1)
11 = 1 * (0 ^ 10) + 1 * (10 ^ 1)
12 = 2 * (0 ^ 10) + 1 * (10 ^ 1)
13 = 3 * (0 ^ 10) + 1 * (10 ^ 1)
14 = 4 * (0 ^ 10) + 1 * (10 ^ 1)
15 = 5 * (0 ^ 10) + 1 * (10 ^ 1)
16 = 6 * (0 ^ 10) + 1 * (10 ^ 1)
17 = 7 * (0 ^ 10) + 1 * (10 ^ 1)
18 = 8 * (0 ^ 10) + 1 * (10 ^ 1)
19 = 9 * (0 ^ 10) + 1 * (10 ^ 1)
20 = 0 * (0 ^ 10) + 2 * (10 ^ 1)

在我们介绍了十进制和进制约定之后,我们可以转向其他进制。

 

二进制

计算机由电力驱动,所以为了与它们通信,我们需要将我们的(人类)数据转换为电信号。

电信号可以被转换为0和1,如下所示:

1 – 电流开启。

0 - 电流关闭。                                   

我们可以说,0是任何小于X的电压,1是任何大于X的电压(2种状态)。如果我们使用十进制数字,我们需要定义一个更复杂的模型——因为我们需要定义10种状态(每种数字一种)。

曾经有过制造十进制计算机和其他进制的尝试,但最终标准成为了二进制。

不同数字进制的计算机

十进制计算机

https://en.wikipedia.org/wiki/Decimal_computer

三进制计算机

https://en.wikipedia.org/wiki/Ternary_computer

 

二进制与十进制的相互转换

你可以使用不同的技术,但我认为在没有计算器帮助的情况下,将十进制转换为二进制的最简单方法是简单地遍历二进制索引并组装你想要的数字,如下所示:

我们取一个十进制数字:19

首先,我将列出二进制数字的索引。

x 是索引上的数字——在二进制情况下,可以是0或1。

0 索引 = (2^0) * x = 1 * x

1 索引 = (2^1) * x = 2 * x

2 索引 = (2^2) * x = 4 * x

3 索引 = (2^3) * x = 8 * x

4 索引 = (2^4) * x = 16 * x

5 索引 = (2^5) * x = 32 * x

 

32 16 8 4 2 0

现在我们将遍历索引并尝试找到一个适合我们十进制数字的数。

提醒:我们的数字是19

你可以看到32大于我们的数字,所以它不能表示它。

16 是合适的,因为它小于19,所以我们标记它:10000(二进制)。

我们剩下:19 - 16 = 3

现在我们需要用二进制表示3——让我们用剩下的数字再次遍历。

4 2 0

4 太大了……所以我们选择2——我们标记它。

10010

我们剩下 19 - 16 - 2 = 1,这显然是1(二进制)。

让我们组装我们的标记:10011

19 (decimal) = 10011(binary)

 

从二进制转换为十进制时,我们使用与十进制相同的原理。

 

10011 = 1 * (2^ 0) + 1* (2 ^1) + 1 * (2 ^ 4) =1 + 2 + 16 = 19


二进制计算表            
0    =  0 * (2 ^ 0) = 0 (decimal)
1    =  1 * (2 ^ 0) = 1 (decimal)
10   =  1 * (2 ^ 0) + 0 * (2 ^ 0) = 2 (decimal)
11   =  1 * (2 ^ 0) + 1 * (2 ^ 1) = 3 (deximal)
100  =  0 * (2 ^ 0) + 0 * (2 ^ 1) + 1 * (2 ^ 2) = 4 (decimal)
101  =  1 * (2 ^ 0) + 0 * (2 ^ 1) + 1 * (2 ^ 2) = 5 (decimal)
110  =  0 * (2 ^ 0) + 1 * (2 ^ 1) + 1 * (2 ^ 2) = 6 (decimal)
111  =  1 * (2 ^ 0) + 1 * (2 ^ 1) + 1 * (2 ^ 2) = 7 (decimal)
1000 =  0 * (2 ^ 0) + 0 * (2 ^ 1) + 0 * (2 ^ 2) + 1 * ( 2 ^ 3) = 8 (decimal)
1001 =  1 * (2 ^ 0) + 0 * (2 ^ 1) + 0 * (2 ^ 2) + 1 * ( 2 ^ 3) = 9 (decimal)
1010 =  0 * (2 ^ 0) + 1 * (2 ^ 1) + 0 * (2 ^ 2) + 1 * ( 2 ^ 3) = 10 (decimal)
1011 =  1 * (2 ^ 0) + 1 * (2 ^ 1) + 0 * (2 ^ 2) + 1 * ( 2 ^ 3) = 11 (decimal)
1100 =  0 * (2 ^ 0) + 0 * (2 ^ 1) + 1 * (2 ^ 2) + 1 * ( 2 ^ 3) = 12 (decimal)
1101 =  1 * (2 ^ 0) + 0 * (2 ^ 1) + 1 * (2 ^ 2) + 1 * ( 2 ^ 3) = 13 (decimal)
1110 =  0 * (2 ^ 0) + 1 * (2 ^ 1) + 1 * (2 ^ 2) + 1 * ( 2 ^ 3) = 14 (decimal)
1111 =  1 * (2 ^ 0) + 1 * (2 ^ 1) + 1 * (2 ^ 2) + 1 * ( 2 ^ 3) = 15 (decimal)
10000 = 0 * (2 ^ 0) + 0 * (2 ^ 1) + 0 * (2 ^ 2) + 0 * ( 2 ^ 3) +  1 * ( 2 ^ 4)= 16 (decimal)
10001 = 1 * (2 ^ 0) + 0 * (2 ^ 1) + 0 * (2 ^ 2) + 0 * ( 2 ^ 3) +  1 * ( 2 ^ 4)= 17 (decimal)
10010 = 0 * (2 ^ 0) + 1 * (2 ^ 1) + 0 * (2 ^ 2) + 0 * ( 2 ^ 3) +  1 * ( 2 ^ 4)= 18 (decimal)
10011 = 1 * (2 ^ 0) + 1 * (2 ^ 1) + 0 * (2 ^ 2) + 0 * ( 2 ^ 3) +  1 * ( 2 ^ 4)= 19 (decimal)
10100 = 0 * (2 ^ 0) + 0 * (2 ^ 1) + 1 * (2 ^ 2) + 0 * ( 2 ^ 3) +  1 * ( 2 ^ 4)= 19 (decimal)

十六进制(基数为16)

十六进制是一个16进制的数字系统——hexa(六)+decimal(十),它可以用来更易于人类阅读地表示一个大的二进制数字。

由于它是16进制,就像二进制和十进制一样,一个数字可以表示0到15的十进制值。

大于9(十进制)的数字由两个数字表示,在十六进制中,我们用字符来表示它们,以避免混淆。

一个十六进制数字的二进制范围:0000 - 1111(4位)。

一个十六进制数字的十进制范围:

0  1  2  3  4  5  6  7  8  9   A   B   C   D   E   F

0  1  2  3  4  5  6  7  8  9  10   11  12  13  14  15

4位的二进制数据只能由一个十六进制字符表示,所以如果我们看一个“大”的二进制数据示例:

32位二进制数:00010000000100001111000011111011

你可以注意到,它并不容易阅读(至少一眼看上去是这样)。

我们将其转换为十六进制。

我们将大的二进制数分成四位一组(因为这是十六进制数字的范围),并为每组二进制数分配一个相应的十六进制数字。

0001 - 1(十六进制)- 1(十进制)

0000 - 0(十六进制)- 0(十进制)

0001 - 1(十六进制)- 1(十进制)

0000 - 0(十六进制)- 0(十进制)

1111 - F(十六进制)- 15(十进制)

0000 - 0(十六进制)- 0(十进制)

1111 - F(十六进制)- 15(十进制)

1010 - B(十六进制)- 11(十进制)

将我们所有的转换组合起来,我们得到 - 1010F0FB(十进制为269545723)

 

  • 十六进制数字总是带有十六进制前缀 - 0x,在本例中:0x1010F0FB

  • 十六进制数字在计算机中很常用,在处理二进制数据时——使用十六进制。

 

十六进制计算表
0 = 0 * (16 ^ 0) =  0 (binary) = 0 (decimal)
1 = 1 * (16 ^ 0) = 1 (binary)   = 1 (decimal)
2 = 2 * (16 ^ 0) = 10 (binary)  = 2(decimal)
3 = 3 * (16 ^ 0) = 11 (binary)  = 3(decimal)
4 = 4 * (16 ^ 0) = 100(binary)  = 4(decimal)
5 = 5 * (16 ^ 0) = 101(binary)  = 5(decimal)
6 = 6 * (16 ^ 0) = 110(binary)  = 6 (decimal)
7 = 7 * (16 ^ 0) = 111(binary)  = 7(decimal)
8 = 8 * (16 ^ 0) = 1000(binary) = 8(decimal)
9 = 9 * (16 ^ 0) = 1001(binary) = 9(decimal)
A = 10 * (16 ^ 0) = 1010(binary) = 10(decimal)
B = 11 * (16 ^ 0) = 1011(binary) = 11(decimal)
C = 12 * (16 ^ 0) = 1100(binary) = 12(decimal)
D = 13 * (16 ^ 0) = 1101(binary) = 13(decimal)
E = 14 * (16 ^ 0) = 1110(binary) = 14(decimal)
F = 15 * (16 ^ 0) = 1111(binary) = 15(decimal)
10= 0 * (16 ^ 0) +  1 * (16 ^ 1) = 10000(binary)= 16(decimal)
11= 1 * (16 ^ 0) +  1 * (16 ^ 1) = 10001(binary)= 17(decimal)
12= 2 * (16 ^ 0) +  1 * (16 ^ 1) = 10010(binary)= 18(decimal)
13= 3 * (16 ^ 0) +  1 * (16 ^ 1) = 10011(binary)= 19(decimal)
14= 4 * (16 ^ 0) +  1 * (16 ^ 1) = 10100(binary)= 20(decimal)

 

八进制(基数为8)

八进制是一个8进制的数字系统,它使用0到7的数字。

使用八进制数字是表示二进制数字的一种更简单的方式。

如果你将任何二进制数分成三位一组,你将得到可以轻松重新解释为十进制的数字组。

示例:100001111001 -> 100 001 111 001 -> 4 1 7 1 = 2169

八进制在某些地方仍然可能出现,但如今并不像以前那么普遍了……

请注意,8和16都是2的幂。

2^3 = 8, 2^4 = 16.

这就是为什么八进制的二进制范围是000 - 111,而十六进制是0000-1111,因为在二进制数字中增加一个索引会将其值乘以2,在编程中,这种操作称为二进制移位。

维基百科上的八进制

https://en.wikipedia.org/wiki/Octal

一个八进制符号的十进制范围

0 1 2 3 4 5 6 7

所以,如果我们取一个十进制数字 - 192。

我们可以将其写成八进制的300,同样使用我们之前处理十六进制时使用的相同原理。

300 = 0 * (8^ 0) + 0 * (8^ 1) + 3 * (8 ^2) = 0 * 0 + 0 * 8 + 3 * 64 =  3 * 64 = 192

八进制计算表
0 = 0 * (8 ^ 0) = 0 (binary)  = 0 (decimal)
1 = 1 * (8 ^ 0) = 1 (binary)   = 1 (decimal)
2 = 2 * (8 ^ 0) = 10 (binary)  = 2(decimal)
3 = 3 * (8 ^ 0) = 11 (binary)  = 3(decimal)
4 = 4 * (8 ^ 0) = 100(binary)  = 4(decimal)
5 = 5 * (8 ^ 0) = 101(binary)  = 5(decimal)
6 = 6 * (8 ^ 0) = 110(binary)  = 6 (decimal)
7 = 7 * (8 ^ 0) = 111(binary)  = 7(decimal)   
10 = 0 * (1 ^ 8) + 1 * (1 ^ 8) = 1000(binary) = 8(decimal)
11 = 1 * (1 ^ 8) + 1 * (1 ^ 8) = 1001(binary) = 9(decimal)
12 = 2 * (1 ^ 8) + 1 * (1 ^ 8) = 1010(binary) = 10(decimal)   
13 = 3 * (1 ^ 8) + 1 * (1 ^ 8) = 1011(binary) = 11(decimal)           
14 = 4 * (1 ^ 8) + 1 * (1 ^ 8) = 1100(binary) = 12(decimal)
15 = 5 * (1 ^ 8) + 1 * (1 ^ 8) = 1101(binary) = 13(decimal)           
16 = 6 * (1 ^ 8) + 1 * (1 ^ 8) = 1110(binary) = 14(decimal)           
17 = 7 * (1 ^ 8) + 1 * (1 ^ 8) = 1111(binary) = 15(decimal)
20 = 0 * (1 ^ 8) + 2 * (1 ^ 8) = 10000(binary)= 16(decimal)           
21 = 1 * (1 ^ 8) + 2 * (1 ^ 8) = 10001(binary)= 17(decimal)           
22 = 2 * (1 ^ 8) + 2 * (1 ^ 8) = 10010(binary)= 18(decimal)           
23 = 3 * (1 ^ 8) + 2 * (1 ^ 8) = 10011(binary)= 19(decimal)           
24 = 4 * (1 ^ 8) + 2 * (1 ^ 8) = 10100(binary)= 20(decimal)       
八进制详述

八进制数字用于Unix文件权限,例如,当你调用chmod命令时,你就是用八进制数字指定权限。

chmod 754 myfile.temp

该命令将相应地更改名为“myfile.temp”的文件的权限。

Unix权限一览

4 代表“读取”,

2 代表“写入”,nds 代表“执行”,并且

0 代表“无权限”。

 

所以,在本例中:

7 代表组合:4 + 2 + 1(读取、写入和执行)。

5 代表组合:4 + 1(读取、执行)。

4 代表 4(读取)。

 

有三组:世界、组和用户。我们在chmod命令中的每个八进制数字都代表其中一组的权限。

第1个 - 用户,第2个 - 组,第3个 - 其他(世界)。

摘要

当您理解了数字进制的工作原理后,将一个进制转换为另一个进制就变得相当容易了,然而,

在编程中,您可能会比其他进制更常遇到十六进制,因为它更常见。

 

© . All rights reserved.