二进制数的表示法,如 1000100B - 1

“嗨,阿米戈!”

“嗨,比拉博!”

“我想告诉你一些不同的编号系统。”

“您已经听说过人们使用十进制系统。以下是该系统的主要事实:

1)  10位数字用于写数字:0, 1, 2, 3, 4, 5, 6, 7, 8, 9。

2) 数字 543 表示 5 个百 + 4 个十 + 3 个个。

"这相当于写成5*100 + 4*10 + 3*1,可以写成5*10 2 + 4*10 1 + 3*10 0

请注意,千、百、十和个是数字 10 的幂。

1)一是 10 的零次方。

2) 十是 10 的一次方。

3)一百是 10 的二次方。

4) 一千是 10 的三次方,等等。

“是的。知道了。”

“但现在想象一下,我们只有 8 位数字。然后我们有了八进制系统。以下是它的主要事实:”

1)  8位数字用于写数字:0、1、2、3、4、5、6、7。

2) 数字 543 8表示 5*8 2 +4*8 1 +3*8 0。也就是说,5*64 + 4*8 + 3*1 = 320+32+3 = 320+32+3=355 10

我写了8和10作为下标,表示用多少位数来表示这个数。

“我想我明白了。我想我可以将一个数字从八进制系统转换为十进制系统。但我可能无法采用其他方式。”

“没那么难,想象一下,你需要用几辆卡车来搬运一堆沙子。你有自卸车,有普通卡车,也有非常小的卡车。但卡车没有装满就走不了。”

“你会怎么做?”

“首先,我会装满自卸卡车,因为它们是最大的。然后,当我发现没有足够的沙子装满卡车时,我会换成较小的车辆。然后是更小的车辆。”

“这里其实很相似,我们试试把355 10这个数字转回八进制吧。”

“首先,我们将它除以 64 (8 2 ),得到 5,余数为 35。这意味着我们数字的第一位数字是 5。然后我们将余数除以 8 (8 1 ),得到 4,余数的 3。因此,我们得到数字 543 8。

”对了,你也可以往另一个方向移动,毕竟543 8 == 5*64+4*8+3 == ((5)*8+4)*8+3。我们的八进制“tens " 和 "hundreds" 必须除以 8。因此,除以 8 的余数将是我们的八进制数字。"

“首先,我们将355除以8,得到44,余数为3。即355=44*8+3。44可以表示为5*8+4。因此,355=(5*8+ 4)*8+3; 这是我们的数字:5, 4, 3。我们要找的数字是 543 8。"

“我想我明白了,但我需要多加练习才能完全理解所有内容。”

“编程通常涉及使用不同基数的数字(即数字系统中使用的位数)。最流行的是 2、8、10、16 和 64。”

“但为什么这是必要的?为什么我们需要用 2、8、16 或 64 位数字表示的数字?”

“这是关于处理器内部如何工作的。很简单,如果有电流流过电线,那么我们说它的值为1;如果没有电流,那么它的值为0。所有数字都存储在存储单元中。这些细胞有一个非常基本的设计。它们只能存储 0 或 1。”

“但这种简化(只有 0 或 1)使得处理器和内存内部的元件变得非常小成为可能。现代处理器和内存模块包含数十亿个不同的元件。它们的面积通常不超过一平方厘米。”

“哇。现在我知道了。”

“现在我们转向二进制数。这里我们有与八进制相同的东西,只是更容易。”

1)  2位数字用于写数字:0、1。

2) 数字 101 2表示 1*2 2 + 0*2 1 + 1*2 0换句话说,就是 1*4+0*2+1*1 =4+1=51 10

“是的,我记得。一个单元格,可以有 0 或 1 的值,被称为位。但它不能存储太多信息,所以它们被组合成 8 个一组。这些组称为字节。 “

“没错。一个字节是一组八位。它可以存储以下值:00000000、00000001、... 11111111。这些值对应于十进制数 0,1、... 255。这使我们总共有256 个值。”

Java中最大的整数是多少?或者更确切地说,它的类型是什么?

“一个长整型。一个长整型由 8 个字节组成。换句话说,64 位。它可以存储从 -2 63到 2 63 -1 的值。

“是的。我不会涉及如何将数字从十进制转换为二进制,反之亦然。否则,课程会太长。”

“相反,让我们多谈谈十六进制系统。”

“是的,这很有趣。对于二进制和八进制系统,我们只是去掉了数字,分别从二和八开始。但是我们在这里做什么?添加新数字?”

“完全正确!看看这个:”

1) 16位数字用于写数字:0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。

2)数字 543 16表示 5*16 2 + 4*16 1 + 3*16 0换句话说,它是 5*256+4*16+3*1 = 1280+64+3 = 1347 10

“所以,我们只是将字母添加为数字?O_o”

“是的。有什么大不了的?为什么要在字母工作得很好的情况下发明新数字?检查一下:”

十六进制数字 十进制值
0 0
1个 1个
8个 8个
9 9
A 10
11
C 12
13
14
F 15

“我也不打算谈论从十进制到十六进制的转换。但这是一个有趣的事实。十六进制数字正好由 4 位表示,值从 0 到 15。因此,一个字节可以用八个二进制数字写入(0 或 1)或两个十六进制数字。”

“这是一个例子:”

十进制数 二进制数 十六进制数
0 0000 0000 00
1个 0000 0001 01
15 0000 1111 0f
16 0001 0000 10
31 0001 1111 1f
32 0010 0000 20
128 1000 0000 80
129 1000 0001 81
255 1111 1111 ff

“十六进制表示很容易转换为二进制(反之亦然)。这就是为什么在编程中很少以二进制(使用 0 和 1)给出数字的内部字节表示。那样太长且难以理解。十六进制表示法更具可读性和紧凑性。”

“我同意。连我都喜欢。”

“顺便说一句,Java 允许您直接在代码中编写各种编号系统中的数字:”

根据 特色 例子 无效数字
2个  数字开头的0b 0b 00001111 0b 11111 2 1
8个  数字开头的0 0 1234343 0 12 8
10 没有任何 95459 909
16  数字开头的0x 0x 10ff 0x 1c

“很棒的一课。谢谢你,Bilaabo。”