进制转换

1.十进制转二进制

十进制转二进制以2辗转相除取余。例如十进制649转二进制

1355 ÷ 2 = 677余1 ÷ 2 = 338余1 ÷ 2 = 169余0 ÷ 2 = 84余1 ÷ 2 = 42余0 ÷ 2 = 21余0 ÷ 2 = 10余1 ÷ 2 = 5余0 ÷ 2 = 2余1 ÷ 2 = 1余0 ÷ 2 = 0余1

然后从右往左取余便是二进制。为 10101001011。补足进制位为 0101 0100 1011。但是可以更简洁

1355 677 338 169 84 42 21 10 5 2 1 0

然后从右往左一个一个乘以进制数也就是2然后再用前面一位减去当前结果然后取余。但是需要注意的是0乘以任何数字都是0。所以0不相乘而是直接取倒数第二位为余数。然后再从倒数第二位开始乘以进制数然后再往左开始用左边的一位数字减去当前相乘的结果取余

结果为10101001011。但是按照二进制补位的话需要在前面补0。完整的二进制位为0101 0100 1011。二进制数四位为一组。但是如果按完整比特位来算的话则是8位为一组也就是1个字节 = 8Bit。也就是0000 0101 0100 1011。那么当前是两组比特位共为16位比特位也就是2个字节

2.十进制转八进制

十进制转八进制同理也是辗转相除

1355 ÷ 8 = 169余3 ÷ 8 = 21余1 ÷ 8 = 2余5 ÷ 8 = 0余2

然后从右往左取余为2513。简化之后为

1355 169 21 2 0

然后从右往左一个一个乘以进制数也就是2然后再用前面一位减去当前结果然后取余。这里也是直接取倒数第二位为余数。然后再从倒数第二位开始乘以进制数然后再往左开始用左边的一位数字减去当前相乘的结果取余

结果为2513。完整的八进制为02513

3.十进制转十六进制

十进制转16进制也是16辗转相除。但不同的是9以后的数字是以字母代替的。ABCDEF = 10 11 12 13 14 15

1355 ÷ 16 = 84余11 ÷ 16 = 5余4 ÷ 16 = 0余5

然后从右往左取余为54B

简化后为1355 84 5 0

然后从右往左一个一个乘以进制数也就是2然后再用前面一位减去当前结果然后取余。这里也是直接取倒数第二位为余数。然后再从倒数第二位开始乘以进制数然后再往左开始用左边的一位数字减去当前相乘的结果取余

结果为54B。完整的十六进制为0x54B

计算补充

而对于一些新手来说可能没看懂上面的算法。所以这里拆解并且优化一下。更方便理解

首先是1355。就用十六进制举例。1355为十进制。转为十六进制。那么就需要1355除以16。且结果必须是整数然后取余数

1355 ÷ 16 = 84余11

11就是余数。然后再继续将结果除以16直到商(结果)小于除数(16)。但余数可以先不写或分隔开。那么就是这样的。

1355 84.11 5.4 0.5

点后面的数字为余数。点左边的数字为商(结果)。从右往左取余数直到左边第一位时结束。结果为54 11。但十六进制当中9以上的数字需要用字母代替。11对应字母b。那么也就是54b。而完整的十六进制表达需要在前面加上0x。也就是0x54b。这样十进制转16进制就转好了。至于为什么后面要把0写出来那是为了把余数写出来。5÷16因为这不是浮点数运算所以在这里是除不掉的所以结果为0。5直接归为余数

进制知识

计算机当中一般二进制 十进制 十六进制用的最多。其他进制一般用的较少甚至不用。除非涉及算法加密之类的才可能用得到。其次在计算机内存数据存储当中进制数据开头是不一样的

二进制:0b 例如:0b1001

八进制:0 例如:045

十六进制:0x 例如:0xFF0017A2

而十进制就是正常写就行。123456这种。

其次就是进制数讲究 逢X进1。例如二进制就是逢2进1。十进制就是逢10进1。就比如9之后就是10那么就要往前进一位。也就是10。二进制也是。十进制的1是二进制当中1。十进制的2在二进制当中就是10。十六进制也是如此。所以在除日常生活冲使用的十进制以外其他进制当中见不到当前进制的数字。

*进制转十进制

1.二进制转十进制

例如二进制值为100101

那么转换过程则是。先从左往右取位值。然后乘以 (当前进制) 的位数-1 (从右往左取位数-1) 次方。然后再往后取值以同样的方法相乘在相加。大概如下

100101 = 1×2^5 + 0×2^4 + 0×2^3 + 1×2^2 + 0×2^1 + 1×2^0

结果为37。但是因为0乘以任何数都是0所以可以直接忽略简化

100101 = 1×2^5 + 1×2^2 + 1×2^0

2.八进制转十进制

计算方法和二进制转十进制一样。例如八进制为6905

6705 = 6×8^3 + 7×8^2 + 5×8^0

结果为3525。因为0乘以任何数都是0所以直接忽略

3.十六进制转十进制

计算方法相同。例如十六进制值为0xFA18

0xFA18 = F(15)×16^3 + A(10)×16^2 + 1×16^1 + 8×16^0

结果为64024。前面的0x是进制头所以不用管。直接从F开始计算

进制之间的快捷转换(进阶)

十进制转二进制(拆数字比大小)

虽然辗转相除法简单但是麻烦。拆数字方法更快。无非就是最开始需要适应。用拆数字的方法转二进制。首先需要了解2的整次幂。也就是(2 4 8 16 32 64 128 256 512 1024 2048 4096.......)。其次以961为例。将961用次方幂中最接近但又不能比961大的一个数字拿出来。然后用这个幂跟961比大小。如果幂比数字小那么就需要反减。如果有结果则当前二进制位为1。再用后面的幂跟数字反减后的结果比大小。如果幂大于数字则为0

512 - 961 = 449

这里512比961小所以反减。那么也就是 961 - 512 = 449。因为幂比数字小需要反减而且有结果。所以这里的二进制位为1。其次这里有个十进制运算的小知识。减法时可以从右往左一位一位去减。而这里的1 - 2因为1比2大所以先反减然后向前面借一位然后再减去反减之后的结果。也就是 2 - 1 = 1 = 10 - 1 = 9。那么前面一位6 - 1这里被借了一位所以过程是这样的6 - 1 = 5 - 1 = 4。所以最终结果为449。当然加法也是这样。从右往左一位一位相加。如果相加加过大于10那么就给前面加1

(↓幂) (↓数字)

512 = 961 = 449 (1)

256 = 449 = 193 (1)

128 = 193 = 65 (1)

64 = 65 = 1 (1)

32 = 1 =(0) (因为幂比数字大所以没有结果。二进制位直接为0)

16 = 1 =(0)

8 = 1 = (0)

4 = 1 = (0)

2 = 1 = (01) (因为1比2小所以直接把1归为二进制位数)

那么从上到下的结果为11 1100 0001。因为二进制最小为4位一组。所以需要在前面补0。结果为0011 1100 0001。

以二进制作为中转进行不同进制的转换

除了十进制以外。其他进制转二进制都需要考虑被转换的进制是多少。八进制转二进制需要三个二进制位。十六进制转二进制需要用到四个二进制位。并且可以单个值拆开来转

例如八进制的047转为二进制

4 7

↓ ↓

100 111

那么按二进制的四位一组来补零整合一下就是0010 0111。

那么如果将十六进制转为二进制则是需要四个二进制位。例如0x9BF

9 B F

↓ ↓ ↓

1001 1011 1111

那么1001 1011 1111就是转为二进制后的结果

二进制也可以按照上面所说的进制位数进行分割然后转为其他进制。例如将上方的十六进制9BF转为八进制。那么二进制已经转换出来了。所以按照位数对二进制进行分割。八进制需要用到三个二进制位。然后再分别将三个进制位转为八进制

100 110 111 111

↓ ↓ ↓ ↓

4 6 7 7

那么八进制结果为04677。那么如果将上方的八进制转十六进制的话就需要分割为四个进制位

0010 0111

↓ ↓

2 7

那么十六进制结果为0x27

为什么十进制不能拆开单个数字转为二进制

首先。八进制和十六进制都是2的整次幂。而十进制不是2的整次幂。在上方所说的八进制为三个二进制位以及十六进制为四个二进制位当中他们的最大值刚好是二进制的最大值。八进制的值最大是7。7的二进制刚好是111。而十六进制的15 (F)是他的最大值。二进制当中为1111。但是如果是十进制。那么它的最大值是9也就是1001。用三个进制位不够。四个进制位又多余装不满。所以十进制不能单个数字拆开转换就是跟2的整次幂有关。而八进制和十六进制所需要的二进制位也跟2的整次幂有关。8是2的3次幂。所以他转二进制的时候需要占用三个二进制位。而16是2的4次幂。所以他需要四个二进制位。而因为10不是2的整次幂所以没办法单独将十进制的单个数值转为二进制。因为没办法用几个进制位去容纳。所以十进制要想转为其他进制只有两个方法。辗转相除法先转为二进制再转为其他进制。或者拆数字比大小转为二进制再转为其他进制

你为什么要了解不同进制之间的转换?