十进制整数 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 | 0 * 2⁰ + 1 * 2¹ + 0 * 2² + 1 * 2³ + 0 * 2⁴ + 1 * 2⁵ + 0 * 2⁶ |
加上符号为 42,所以,(00101010)₂ = (42)₁₀
(2)首位是 1 代表负整数,先转成原码,再参考上面的方法。
举例:将 11010110
转换为十进制
- 反码为
11010101
- 原码为
10101010
1 | 0 * 2⁰ + 1 * 2¹ + 0 * 2² + 1 * 2³ + 0 * 2⁴ + 1 * 2⁵ + 0 * 2⁶ |
加上符号为 -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)后面的文章会再说
二进制和十进制的互转方法,你搞懂了吗?