十进制转二进制:把数字写回机器的母语
这个换算在做什么
它把一个十进制数改写成只由 0 和 1 组成的形式,每一位对应一个 2 的幂。每个整数都只有一个二进制写法,两个方向都不会丢失信息,所以这是一次改写而不是近似:哪怕数值有三十位,结果也精确到最后一位,而普通浮点计算器在这个量级早就开始出错了。
余数为什么要倒着读
用 2 反复去除,最先得到的是最低位,所以余数必须从下往上读。按书写顺序直接抄下来是手算时最常见的错误,它会把 156 写成 00111001,而正确答案是 10011100。每一步的余数都是答案里真实的一位,除到商为 0 所用的步数,正好等于结果的二进制位数。
十进制转二进制对照表
编程里最常出现的小数值及其二进制写法。真正值得背下来的是 2 的各个幂,其余数字都能由它们拼出来。
| 十进制 | 二进制 |
|---|---|
| 0 | 0 |
| 1 | 1 |
| 7 | 111 |
| 8 | 1000 |
| 10 | 1010 |
| 15 | 1111 |
| 16 | 10000 |
| 31 | 11111 |
| 64 | 1000000 |
| 100 | 1100100 |
| 127 | 1111111 |
| 200 | 11001000 |
| 255 | 11111111 |
| 1000 | 1111101000 |
你每天碰到二进制却没注意到
文件权限、网络掩码、功能开关寄存器和图像的每个颜色通道,本质上都是穿了别的外衣的二进制数。把 156 读成 10011100,一眼就能看出最高位和中间四位是 1,而当一个状态寄存器看起来不对时,你想问的正是这个。十六进制只是让同样的读法更短,底下仍然是那些位。
心算靠减 2 的幂
想快速得到答案,就不断减去当前装得下的最大 2 的幂:156 − 128 = 28,28 − 16 = 12,12 − 8 = 4,4 − 4 = 0,于是 128 + 16 + 8 + 4 = 10011100。这个方法好用,是因为二进制里每一位要么整个存在,要么完全不存在。
常见问题
怎样手算十进制转二进制?
用 2 去除,记下余数,再用商继续除以 2,直到商为 0。把余数从最后一个往前读就是二进制数。以 156 为例,余数依次是 0、0、1、1、1、0、0、1,倒过来读就是 10011100。
一个十进制数需要多少位二进制?
能被 2 整除几次就需要几位,也就是以 2 为底的对数向上取整。255 以内需要 8 位,65535 以内需要 16 位,约 43 亿以内需要 32 位。本工具显示真实位数,不会补齐到固定宽度。
这个转换器能处理超出计算器范围的数吗?
可以。多数计算器一超过 2 的 53 次方就转入浮点并开始舍入,而这里全程使用精确整数运算,64 位数值的每一位都正确,不会给出一个看着合理的近似值。
负数会怎么显示?
在二进制数字前面加一个负号,也就是符号加绝对值的形式。补码是另一套约定,必须先确定位宽才有意义,所以这里不用。如果你需要某个负数在 32 位下的补码写法,请在你自己的代码里显式说明。
支持小数吗?
支持,而且如实处理。整数部分精确转换;小数部分逐位展开,一旦余数为 0 就立即停止。像十分之一这样的分数在二进制里永远不会终止,此时结果会被截断,页面也会明确标注,而不是假装答案已经完整。