0%

搞懂二进制十进制互转方法

十进制整数 N 可以表示为 N₁₀,二进制整数 N 可以表示为 N₂。

重要:为了简洁说明,约定本文以下内容中都使用一个字节,也就是 8 个 bit 来表示二进制数。

正整数转二进制

除 2 取余直到商为 0 时为止,然后倒序排列余数,最后高位补 0。

举例:将 42 转换为二进制
除二取余直到商为 0 时为止

  • 42 / 2 = 21 ⋯⋯ 0
    • 21 / 2 = 10 ⋯⋯ 1
    • 10 / 2 = 5 ⋯⋯ 0
    • 5 / 2 = 2 ⋯⋯ 1
    • 2 / 2 = 1 ⋯⋯ 0
    • 1 / 2 = 0 ⋯⋯ 1
  • 倒序排列余数为 101010
  • 高位补 0 为 00101010

所以,(42)₁₀ = (00101010)₂

负整数转二进制

在前面的文章中我们知道,负数在计算机中以原码的补码形式表示。

举例:将 -42 转换为二进制

  • (42)₁₀ = (00101010)₂
  • -42 的原码为 10101010
  • 反码为 11010101
  • 补码为 11010110

所以,(-42)₁₀ = (11010110)₂

小数转二进制

整数部分同正整数转二进制;小数部分乘以 2,取结果的整数部分,直到小数部分为 0 (此时二进制的最后一位为 0 或 1)或者位数已达到所要求的精度为止。然后把每次结果的整数部分按先后次序排列,即可得到二进制小数部分序列。

举例:将 42.125 转换为二进制

  • 整数部分 (42)₁₀ = (00101010)₂
  • 小数部分乘以 2,取结果的整数部分,直到小数部分为 0 或者位数已达到所要求的精度为止
    • 0.125 * 2 = 0.25,整数部分为 0
    • 0.25 * 2 = 0.5,整数部分为 0
    • 0.5 * 2 = 1,整数部分为 1
  • 把每次结果的整数部分按先后次序排列为 001

所以,(42.125)₁₀ = (00101010.001)₂

二进制转十进制

(1)首位是 0 代表正整数,从右到左用二进制的每个数去乘以 2 的相应次方并递增。

举例:将 00101010 转换为十进制

1
2
3
4
0 * 2⁰ + 1 * 2¹ + 0 * 2² + 1 * 2³ + 0 * 2⁴ + 1 * 2⁵ + 0 * 2⁶
= 1 * 2¹ + 1 * 2³ + 1 * 2⁵
= 2 + 8 + 32
= 42

加上符号为 42,所以,(00101010)₂ = (42)₁₀

(2)首位是 1 代表负整数,先转成原码,再参考上面的方法。

举例:将 11010110 转换为十进制

  • 反码为 11010101
  • 原码为 10101010
1
2
3
4
0 * 2⁰ + 1 * 2¹ + 0 * 2² + 1 * 2³ + 0 * 2⁴ + 1 * 2⁵ + 0 * 2⁶
= 1 * 2¹ + 1 * 2³ + 1 * 2⁵
= 2 + 8 + 32
= 42

加上符号为 -42,所以,(11010110)₂ = (-42)₁₀

(3)小数是将小数点后从左往右乘以二的相应负次方并递减。

举例:将 00101010.001 转换为十进制

  • 整数部分 (00101010)₂ = (42)₁₀
  • 小数部分为 0 * 2⁻¹ + 0 * 2⁻² + 1 * 2⁻³ = 1 * 2⁻³ = 0.125

所以,(00101010.001)₂ = (42.125)₁₀

凑字数

当然,浮点数在计算机中不可能这么表示,它也有自己的一套标准。

浮点数的部分可以先暂且这么理解,关于IEEE二进制浮点数算术标准(IEEE 754)后面的文章会再说

二进制和十进制的互转方法,你搞懂了吗?


欢迎关注我的其它发布渠道