二进制与十进制的转换实际上根本不是啥高深学问,就是单纯的加减乘除和位置权重,但要是真懂原理,世界就豁然开朗了。 想象一下,计算机世界里的数字,说白了就是二进制。它不用像我们那样记 0 到 9 的口诀,也不用十进制那样满是多少就进 1。在计算机眼里,0 和 1 就是开关,1 代表开,0 代表关。
要是说十进制是讲故事,那二进制就是记谱。
比如二进制里的"101",听起来像个密码,但在底层逻辑里它等于十进制的五。
这如何算的?就是把左边那个 1 当 100 权,中间 0 当 0,右边 1 当 1,加起来就是 100+0+1=5。
反过来呢,十进制的 6 如何变?六就是 4+1+1,就在 4 的基础上加两个 1,写成二进制就是 110。
这一套规则在计算机 42 年历史上一直没变,出于二进制运算比十进制稳当多了,电脉冲进 1 进 0 这种操作,出错概率极低,并且只靠开关即可实现,好办粗暴。 大量人会被“逢二进一”这种说法劝退,当作耳朵不好,读不懂。
实际上这不过是一种记号习惯,核心逻辑就是权重。二进制里 1 代表正整数,0 代表负整数,要么 0 代表没有。在向下转换的时候,我们是从高位往低位“倒”那会儿,每一个位置代表的数值都是 2 的几次方,分别是 164821 次、213 次、21 次、2 次、1 次。
比如十六进制的 A,在二进制里就是 1010。
看,A 这个符号拆开就是个 1。十六进制实际上是把 0 到 15 这 16 个数字给压缩了,出于 0 到 15 加起来正好是 16,也就是二进制下 4 个一位数凑足了。
故此十六进制在二进制里不过是四个一位数叠加的简化版。 当我们要把一段十进制字符串变成二进制时,实际上是在做乘法加法混合的操作。
比如把十进制的 13 转成二进制,咱们得想 13 等于几倍的二进制数。16 忒大了,12 又小了点,试一下 8 倍二进制数。2 的三次方就是 8。8 乘以 1 加 4 乘以 1 再加 1 乘以 1,刚好凑成 13。
故此 13 的二进制就是 1101。
这个过程实际上就是把十进制数字分别乘以 2 的幂次,然后加 1 或减 1,最终看哪些位置出现了 1。 还有一种情况,就是十进制转二进制在代码实现里常遇到的“除以 2 取余数”法。
这是最通用的做法,不管多长,只要按位除就能搞定。
比如把十进制的 100 转成十六进制。咱们先算十进制,100 除以 16,商是 6,余数是 4。余数是 4,说明最终一位十六进制数就是 4。
然后把 100 除以 16 的商 6,再算一次,商是 3,余数是 0。
接着把 6 除以 16,商是 0,余数是 6。
这就停下来了,出于商已经是 0 了,说明除法终止了。最终把这些余数倒着排一下:0、4、6,合起来就是 64100。
这就是十六进制的表示法。 反过来操作,就是从二进制往十进制“加”。
比如有个二进制数 1101101。算十进制就得先把左边的 1 乘 64,中间的 1 乘 32,后面 0 乘 16,再乘 8。算完加法:64 加 32 是 96,再加 8 是 104,再加 16 是 120,再加 4 是 124。
故此 1101101 的二进制对应十进制就是 124。
这就是“加权求和”的根本逻辑。 在实际使用中,比如处理网络数据包要么加密算法,我们时常需求把长串的二进制数据转换成二进制,再转十进制。
实际上也就是多次执行“除以 2 取余数”的操作,再倒序排列结局。
比如把十六进制的 0x5A 转十进制。0x5A 在二进制里是 0101 1010。先把 0101 当五,1010 当十。五乘以 16 加十等于 80。
故此 0x5A 就是十进制的 90。 最终发现,二进制和十进制本质上就是数的不同表达体系。二进制靠位权,十进制靠个位。它们之间没有魔法,只有运算规则的差异。转换的过程实际上就是在不断的分解和重组。把十进制拆解成 2 的幂次求和,要么把二进制展开成 2 的幂次做乘法。
只要掌握这个原理,你会发现大量复杂的进制转换实际上就在一行代码里就能搞定,并且效率极高。毕竟计算机就是靠 0 和 1 在电路上飞速流转的,搞懂这一点,对理解计算机底层逻辑简直忒关键了。