二进制转十进制的公式实际上是把一串 0 和 1 给“翻个身”,再乘上对应的权重再加起来。别老想着背公式,人脑有时候比计算器还精通这活儿。你拿个红白棋,要么随意拿个小本子,把二进制写下来,然后从最右边那个 1 启动,数数它隔几个 0,就知道它前面代表的是几。
比如二进制 1011,从右往左数,个位是 1 乘 1,十位是 1 乘 2 等于 2,百位是 0 乘 4 等于 0,千位是 1 乘 8 等于 8。最终把这些数加起来,8 加 2 加 0 加 1,结局就是个十进制数 11。
实际上这个逻辑挺好办,就是看着权重的位值表,一个 1 就在对应的那一列,在的话就把那列的数值加进去,不在的就算了。 有时候具体算起来还是有点绕,不如给个直观的例子。二进制 10101 转十进制,要是是硬背公式好办晕,不如想象它是 10101 堆木板,每块木板代表一列,从右往左分别是 1、2、4、8、16 的权重。最右边那块是 1 号木板,底下有,得加 1;接下来是 2 号木板,底下没,丢;3 号木板底下有,加 2;4 号木板底下没,丢;5 号木板底下有,加 4。加起来就是 7。再复杂一点的,比如二进制 11000011。
这串数绕眼,但拆开来看,从右往左,个位是 1 加一,次位是 1 加二,三、四、五、六位都是 0 全丢,最终七、八位又是 1,加八和十六。算出来就是 128 加 64 加 2 加 1,凑成 195。
这种逐位检查的方式,不管位数多少,只要心算到位都能行,中间没多少陷阱。 大量人当作二进制直接转十进制忒难了,实际上没那么吓人,大量日常场景里用的就是这招。
比如你连手机用的支付密码,要么编程时处理的数据,底层全是 0 和 1。你只需求记住:每一位都是它所在位置的 1 经过乘以 2 的幂次。2 的 0 次方是 1,0 次方是 1,1 次方是 2,2 次方是 4,3 次方是 8。
故此最终一位就是权重 1,倒数第二位是 2,再往左依次是 4、8、16、32、64……只要把二进制字符串倒过来读,看看每个位置有没有 1,有就乘上对应的数加总,就是十进制数了。 举个例子,二进制数 10101101 转十进制。先别急着算,把它拆成几个局部看。最右边两位是 10,那就是 4 加 2 等于 6。再接下来两位是 11,那就是 8 加 2 等于 10。
接着两位 01 是 1,01 是 2。最终多位 10 是 4,1000 是 8。把这些块一个个加起来:6 加 10 加 1 加 2 加 4 加 8,结局正好是 31。
这种分块计算有时候比从头到尾硬算快多了,特别是数字挺长的时候。 再说说实际应用,比如计算机存 Byte 的数据结构。一个字节顶多存 8 位二进制,范围是从 00000000 到 11111111。00000000 就是 0 个十进制数,11111111 就是 255。中间中间,比如 01111111,那就在 128 到 255 之间。
要是你看到十六进制数,实际上也是为了撇脱,比如 10 代表 16 的十进制数。但归根结底,把二进制转十进制,就是要把这些 0 和 1 重新组合,变成大家通用的数字语言。
这个过程不需求复杂的运算技巧,更多是靠对位值和权重的熟悉。 在一些编程环境里,你可能见过 `int to_bin` 要么 `bin to int` 这种函数,实际上逻辑就一条:把整数不断除以 2,余数就是二进制的一位,反过来拼起来就是原数。别看这在某些高级语言里挺易用,但在理解原理时,还是得回到手动转换。
比如你手上有个整数 42,你除以 2 拿到余数 0,商 20,再除以 2 余 0,商 10,再除以 2 余 0,商 5,再除以 2 余 1,商 2,最终除以 2 余 0,商 1。最终从最终一位启动倒序写出来,就是 101010。
这个 101010 就是十进制 42 对应的二进制表示。
反过来要是给你 101010,从右往左乘 2 然后加余数,也是同样的过程。 有些时候,好办的加法好办出错,特别是连续多位的时候,好办把 0 漏掉要么把 1 算错。
这时候不妨试试换个方式,用位运算里的进位逻辑。
比如二进制 101 转十进制,实际上就是 2 的 2 次方加上 2 的 0 次方。2 的 2 次方是 4,2 的 0 次方是 1,4 加 1 等于 5。
这种思路有时候比单纯列乘法更清楚,特别是当二进制数挺短的时候。 除此之外,还有另一种理解方式,就是看二进制数有多少个 1,还有它们的位置。
要是全是 1,那就是 2 的 n 次方减 1。
比如 111 就是 7,2 的 3 次方减 1。
要是只有一个是 1,那就是那个位置对应的 2 的幂。
要是位置是 0,就是 1;位置是 1,就是 2;位置是 2,就是 4。
这种方式能麻利心算出结局,不需求一步步乘除。
比如 1011 的位置分别是 0 和 3,那就是 1 加 8 等于 9。 还有个小技巧,就是把二进制数看作一串灯,每盏灯亮代表 1,没亮代表 0。十进制数就是让你数有多少盏灯亮,还有它们在啥位置上亮。
比如二进制 01011001,就是数一下有多少灯亮。从右往左数,第 0 位亮,第 1 位亮,第 2 位亮,第 3 位亮,第 4 位亮,第 6 位没亮,第 7 位没亮。一共是 6 个灯亮。再数它们的位置权值:2 的 0 次方、2 的 1 次方、2 的 2 次方、2 的 3 次方、2 的 4 次方、2 的 6 次方。加起来就是 1 加 2 加 4 加 8 加 16 加 64,等于 95。
这种“数灯数位”的模型,有时候比硬乘除法更形象,特别适合快速估算。 二进制转十进制之故此复杂,是出于它结合了位置权值、进位逻辑和位运算等多种概念。但一旦你理解了位权的核心,实际上就是一件挺好办的事。
只要记住是从右往左,每个位代表 2 的幂次,有就加,没就不加,就能把二进制串变成十进制数。
不需求死记硬背公式,也不需求复杂的运算技巧。剩下的就是娴熟度和心算的稳定性。 最终再细说下参与计算的每一位权重。个位是 2 的 0 次方,等于 1。十位是 2 的 1 次方,等于 2。百位是 2 的 2 次方,等于 4。千位是 2 的 3 次方,等于 8。万位是 2 的 4 次方,等于 16。十万位是 2 的 5 次方,等于 32。百万位是 2 的 6 次方,等于 64。千万位是 2 的 7 次方,等于 128。亿位是 2 的 8 次方,等于 256。玩玩这个表,你会发现位值确实清楚明白,不用再费神去想每位的意义,只要知道哪个位置对应哪个数就行。 有些时候,二进制数和十进制数的转换,还会涉及到补码的概念。
比如负数的表示,二进制 11111111 在计算机里实际上是 -1。
这是一个特殊情况,需求专门的规则去处理。但在一般/平平的二进制转十进制练习中,我们主要处理的是正数,要么把负数转换为十进制整数时,依然遵循这个位权加总的方式,只是符号要另外写上去。 总而言之,二进制转十进制的方式不复杂,核心就一句话:从右往左,权位对应乘 2,有 1 就加。掌握了这个逻辑,再复杂的二进制串都能换算出来。
不需求追求完美,间或算错要么跳过一位也是正常的,最终再回头补上就行。
这种转换方式,也是计算机内部处理数字的基础,也是人类操作数字的起点。