06 重回小学课堂 - 二进制 101¶
我们今天开始进入新的一章-二进制。相信很多人知道二进制是 0 和 1,但是具体的细节可能没有那么的清楚。如果你已经了解了,完全可以跳过这一章(虽然我还是建议你把这章好好看一下)。因为这一章本身就是为了温习一下基础知识。
现在就我们一起坐上这辆时光机器来重温一下曾经的学习。让我们进入二进制 101 的世界。正常计数时,我们以 10 为基数。我们通常不会去考虑规则,因为计数已成为我们生活中如此重要的一部分。大多数时候,我们使用的编号系统甚至没有怀疑或者注意过是什么规则,为什么只有从 0-9。我们最有可能以 10 为底数,因为我们有 10 个手指。另一方面,二进制仅使用占位符的 2 个值(1 或 0)打开或关闭进行计数。因此,在十进制中,我们有 10 个值,从 0 到 9。在二进制中,我们有 2 个值,0 和 1。上小学的第一天,老师就会让我们记住这些占位符以 10 的幂表示。我们从 0 开始计算那个占位符,然后我们最多计数 1,2,3,4,5,6,7,8,和 9。 当我们达到 9 时,我们用完所有值以填充此处的占位符。因此,我们必须添加另一个占位符,即十位数的占位符。然后我们可以再次开始算一个占位符,对吗?从 1‑9、10 一直到 99,直到达到 99,我们都用完了 0 到 9 的所有值,包括 1 和十位的占位符,因此我们必须添加另一个占位符。这次我们添加了百位的占位符。计数到 999 后,我们添加了另一个占位符,然后是一千,一万,再来是十万,然后是几百万,一千万,依此类推。因此,由于手指上有 10 个手指,我们采用这种方式进行计数,然后就演变为这种十进制计数系统。(知道为什么外星文明比我们先进吗,因为手指多。)
我们先来看一下为什么需要学习二进制呢?
二进制为什么重要?¶
- 二进制是编程的基础,但这与逻辑有更多关系,而不仅仅是数据存储。
- 布尔逻辑只有两个真值,“ true”或“ false”。布尔逻辑是计算机的基础。
- 在诸如信息论或安全性之类的更高级的 CS 学科中,从理论上讲,这与数据存储甚至数字系统无关,而与实际的二进制数学有关。
- 此外,如果你正在计算机上打字或对文本进行任何操作,那么你正在处理字符集。作为程序员,你必须了解某些有关字符集的知识。了解这些内容需要掌握使用位和字节存储数据的知识,以及可以在其中存储多少信息(256 个不同的字节),这可以追溯到信息论。最后也涉及到数据存储。
- 不会二进制,不要奢望可以真正的理解 IP,不信,你就跳过这章,直接看第三部分 IP。
- 还有一点就是,二进制的运算是最快的,这也是面试的时候,会问到的点。我就问你,你想不想学吧。
二级制怎么转换成十进制呢¶
我们先来看一下这个,我有一个二进制数是 1100 0000,其实它的每一位占位符依次是(128 位,64 位,32 位,16 位,8 位,4 位,2 位,1 位)。相信你已经看明白了,每一个占位符是上一位的占位数字乘以 2。1 乘以 2 就是 2,2 乘以 2 就是 4,4 乘以 2 就是 8,8 乘以 2 就是 16.。。。以此类推。那怎么转换成 10 进制的数呢,就是通过占位符的数字来乘以那个位数的值也就是 0 或者 1,比如这个例子是 1100 0000,所以加起来就是 128*1 + 64 1 + 32 0 + 16 0 + 8 0 + 4 0 + 2 0 + 1 0 = 192。 让我们再来试另一个数比如 0011 1010,那怎么计算呢 128 0 + 64 0 + 32 1 + 16 1 + 8 1 + 4 0 + 2 1 + 1 * 0 = 32 + 16 + 8 + 2 = 58。你自己可以多算几遍,相信你一定会掌握的。
十进制怎么转换成二级制呢¶
我相信你已经掌握了二进制到十进制,那反过来怎么算呢。让我们来算一下 208。我们还可以用 8 位占位符(128 位,64 位,32 位,16 位,8 位,4 位,2 位,1 位)。从左面第一位也就是 128 位开始 208-128 是不是能得到一个正数呢,如果答案是 yes 的话,那你就可以在这位放一个 1。然后 208-128 就剩 80 了。80 减去 64 是不是也是一个正数呢。答案是 yes,所以 64 位也是 1,现在还剩 80-64 = 16,16 减去 32 是正数吗,不是,所以是 0,16 减去 16 是正数吗,答案是 0。所以也可以放一个 1,因为已经到 0 了,所以就不需要继续计算了,所以答案就是 1101 0000,让我们来验证一下这个答案。128*1 + 64 1 + 32 0 + 16 1 + 8 0 + 4 0 + 2 0 + 1 0 = 208。这个是不是我们验证的那个十进制的数呢。答案是 yes。让我们再来做一个测试,这回试一下 47,从左面第一位也就是 128 位开始 47-128 是不是能得到一个正数呢,如果答案是 no,那你就可以在这位放一个 0。然后看下一位 47 - 64 是正数吗?答案是 no,所以这位也是 0,再继续看,47-32 是正数吗,答案是 yes,所以这位是 1,剩下的数是 15,然后 15 - 16 不是正数,所以是 0,接下来的几位你就自己推算一下,所以答案是不是 0010 1111,再让我们检查一下 128 0 + 64 0 + 32 1 + 16 0 + 8 1 + 4 1 + 2 1 + 1 * 1 = 47。
八进制¶
我们已经掌握了二进制,那现在就让我们来看一下 8 进制。八进制也被叫做 Octal。其实原理都是一样的,这就是举一反三的时候,十进制是逢十进一,二进制是逢二进一,那 8 进制不用我说你也知道了吧。就是逢八进一。所以 8 进制的数就是 0 到 7。你这时候可能会有疑问,二进制用在 IP 地址上,那 8 进制有什么用呢?
八进制广泛应用于计算机系统,比如 ICL 1900 和 IBM 大型机使用 12 位、24 位或 36 位(是不是感觉无穷无尽,会不会有三进制,七进制,哈哈)。八进制是这些基础,因为他们的最理想的二进制字缩写大小能被 3 整除(每个八进制数字代表三个二进制数字)这里你可以想到了吧,所有的基础还是二进制,这也是为什么二进制是最重要和最基础的。四、八到十二个数字可以简明地显示整个机器。它也降低成本使得数字允许通过数码管,显示器,和计算器用于操作员控制台,他们在二进制显示使用过于复杂,然而十进制显示需要复杂的硬件,十六进制显示需要显示更多的数字。
然而,所有现代计算平台使用 16 - 32 位,或者 64 位,如果使用 64 位,将进一步划分为八位字节。这种系统三个八进制数字就能满足每字节需要,与最重要的八进制数字代表两个二进制数字(+ 1 为下一个字节,如果有的话)。16 位字的八进制表示需要 6 位数,但最重要的八进制数字代表(通过)只有一个(0 或 1)。这表示无法提供容易阅读的字节,因为它是在 4 位八进制数字。
因此,今天十六进制为更常用的编程语言,因为两个十六进制数字完全指定一个字节。一些平台的 2 的幂,字的大小还有指令更容易理解。现代无处不在的 x86 体系架构也属于这一类,但八进制很少使用这个架构,尽管某些属性的操作码的二进制编码变得更加显而易见。(我们在后面会讲解 16 进制)
八级制怎么转换成十进制呢¶
其实这个和二进制转成十进制是同一个原理。如果你在上面可以理解的很清楚了,那这里也没有什么难题,这又不是 rocket science,right?好,让我来举一个简单的例子,我现在给你一个 8 进制的数 12,那转成十进制是多少呢?让我们从最暴力的解法开始,就是穷举法。因为从 8 进制有 0-7 个数,所以从 1 到 7 是没有区别的,然后当数值为 8 的时候,是不是 8 进制没有可以表示的东西。那是不是就要进一位了,所以八进制里面的 10 就是十进制的 8,然后 11 就是 9,12 就是 10,对不对。这种方法可以理解吗。如果我们用计算的方式来做,那是不是第一位是个位占位符,第二位是 8 位占位,第三位就是 8 的平方也就是 64 占位符以此类推。然后我来看一下这个例子 12 = 1 8 + 2 1 = 10。这是不是我们穷举出来的结果。
我们再来仔细看一下这个占位符,不要嫌弃我啰嗦呀,都是为了让你可以更清楚,我们说的第一个占位符是 1,第二个是 8,第三个是 64。我希望你能掌握规律,你仔细想一下第一个是不是 8 的 0 次方也就是 1,第二个占位符就是 8 的 1 次方就是 1,第三个也就是 8 的 2 次方也就是 8*8 = 64。然后以此类推。
十进制怎么转换成八级制呢¶
好,那让我们来反过来看一下,十进制怎么转成 8 进制呢,道理同样相同,让我们来看一下这个例子 54,54 小于 64 所以肯定不需要 64 占位符,现在看一下下一个占位符,54 除以 8 是不是等于 6 余数是 6.所以 8 位占位符就是 6,然后剩下的 6 除以 1 占位符。所以这个数值就是 66。反过来验证一下。66 = 6 * 8 + 6 = 54。我现在如果让你写 7 进制或者 6 进制,你会写吗?其实原理都是互通的对不对?
当然这就是这节课索要包含的知识,也就是基础中的基础,但是看似简单,如果你没有学过,其实还是有一点点的小绕,相信我,这些知识就是我在读研究生的时候,都是每一节信号和通信相关的课程的第一课,你可以看出来它的重要性了吧。



