进制之间如何转换

文本关键字:二进制、十进制、进制转换、八进制、十六进制

一、进制

大家最开始接触的数字和计算方法都是基于十进制的,那么进制的意思也就是一种计数方法。根据相应的进制规则进行进位,相同的一串数字在不同的进制下也会对应不同的大小,所以在程序中都会对数字的进制有明确的标识。

1. 十进制

十进制就是满10进1,那么每一位上的数字范围也就只能是0~9,也是默认使用的进制。

2. 二进制

二进制就是满2进1,那么每一位上的数字范围也就只能是0或1,Java中使用0b开头。

3. 八进制

八进制就是满8进1,那么每一位上的数字范围也就只能是0~7,Java中使用0开头。

4. 十六进制

十六进制就是满16进1,对于大于10的数字从字母A开始进行代表,即A代表10,B代表11,F代表15,那么每一位上的数字范围也就只能是0~F,Java中使用0x开头。

二、十进制与二进制的转换

在最开始接触编程时总要学习一下和二进制的转换,因为这是计算机在工作时使用的进制,很多位运算的操作也是在二进制下进行的,所以我们必须要掌握与二进制相关的进制转换。

1. 二进制转换为十进制

将一个其他进制数转换为十进制数的过程其实就是根据相应的进制来进行换算。在转换之前我们先来看一下我们最熟悉不过的十进制,比如:1367。看到这个数字我们都会毫不犹豫的说出:一千三百六十七,这是我们习以为常的事情,但是具体的过程是什么呢?

  • 1367 = 7 × 1 + 6 × 10 + 3 × 100 + 1 × 1000
  • 1367 = 7 × 10^0 + 6 × 10^1 + 3 × 10^2 + 1 × 10^3

从上面的步骤可以看出,其实一个数字的解读其实是从右向左进行的,只不过由于我们对于十进制太过了解所以忽略了这个步骤,那么用这个数字感受一下:1237173927,我猜你一定是在从右往左,从个位开始数,到底是多少吧?
那么其他进制的运算规则也是如此,现在我们就来读几个二进制数。

  • 101:1 × 2^0 + 0 × 2^1 + 1 × 2^2 = 5
  • 10010:0 × 2^0 + 1 × 2^1 + 0 × 2^2 + 0 × 2^3 + 1 × 2^4 = 18
  • 1010101:1 × 2^0 + 0 × 2^1 + 1 × 2^2 + 0 × 2^3 + 1 × 2^4 + 0 × 2^5 + 1 × 2^6 = 85

恭喜,我们的进制转换已经完成了。方法就是从右至左,将乘得的结果进行相加。同时,我们注意到,只要末位是0,那么这个数一定可以被2整除,其他进制也有这个规律(就像个位为零的数一定可以被10整除)。

2. 十进制转换为二进制

  • 常规方法:

将一个十进制数转换为一个二进制数的过程其实就是一个不断算除法和记录余数的过程,既然是转换为二进制,那么我们的除数就是2,具体过程如下:
10进制数:37 -> 二进制结果:100101
进制之间如何转换

  • 小数字快速转换法:

对于不是很大的数字其实有一种比较快的转换办法,但是前提是我们要对2的次方的运算结果比较熟悉,基本上记忆到2的10次方为1024就足够用了。方法就是我们将一个十进制数直接拆解为几个2的n次方加和的形式,从最大的数开始。
比如对于37,最大的二进制数是32,接下来是4,然后是1,那么等式就是:37 = 32 + 4 + 1。

  • 32是2的5次方
  • 4是2的平方
  • 1是2的零次方

所以对应的二进制数的第6个位置,第3个位置,第1个位置上的数字为1(需要错开一位),其他为0。用这种方法也能够快速的知道最高位为1的位置,可以很流畅的按照从左至右的顺序直接将二进制写出来,但是对于大的数字就不太适用了。