进制转换


1.  进制转换

1.1 十进制化为二进制

整数部分,把十进制转成二进制一直分解至商数为0。读余数从下读到上,即是二进制的整数部分数字。 小数部分,则用其乘2,取其整数部分的结果,再用计算后的小数部分依此重复计算,算到小数部分全为0为止,之后读所有计算后整数部分的数字,从上读到下。

将59.25(10) 转成二进制:

  • 整数部分:

59 ÷ 2 = 29 ... 1
29 ÷ 2 = 14 ... 1
14 ÷ 2 =  7 ... 0
 7 ÷ 2 =  3 ... 1
 3 ÷ 2 =  1 ... 1
 1 ÷ 2 =  0 ... 1
  • 小数部分:

0.25 × 2 = 0.5
0.50 × 2 = 1.0

 

所以59.25(10)  = 111011.01(2) 

十进制转换为其他进制,一句话方法:整数部分——除基取余,倒序拼接余数;对于小数部分——乘基取整,正序拼接整数

1.2 二进制化为十进制

将1001012转换为十进制形式如下:

1001012 = [ ( 1 ) × 25 ] + [ ( 0 ) × 24 ] + [ ( 0 ) × 23 ] + [ ( 1 ) × 22 ] + [ ( 0 ) × 2 ] + [ ( 1 ) × 1 ]

1001012 = [ 1 × 32 ] + [ 0 × 16 ] + [ 0 × 8 ] + [ 1 × 4 ] + [ 0 × 2 ] + [ 1 × 1 ]

1001012 = 3710

十进制 0 1 2 3 4 5 6 7 8 9 10
二进制 0 1 10 11 100 101 110 111 1000 1001 1010
十进制1112131415161718192021
二进制 1011 1100 1101 1110 1111 10000 10001 10010 10011 10100 10101
十进制2223242526272829303132
二进制 10110 10111 11000 11001 11010 11011 11100 11101 11110 11111 100000
十进制3334353637383940414243
二进制 100001 100010 100011 100100 100101 100110 100111 101000 101001 101010 101011

1.3 二进制化为八进制


把二进制化为八进制也很容易,因为八进制以8为基数,8是2的幂(8=23),因此八进制的一位恰好需要三个二进制位来表示。八进制与二进制数之间的对应就是上面表格中十六进制的前八个数。二进制数000就是八进制数0,二进制数111就是八进制数7,以此类推。

八进制 二进制
0 000
1 001
2 010
3 011
4 100
5 101
6 110
7 111

八进制转为二进制:

  • 658 = 110 1012
  • 178 = 001 1112

二进制转八进制:

  • 1011002 = 101 1002 (三位一组) = 548
  • 100112 = 010 0112 (三位一组) = 238

1.4 八进制化为十进制

遵循二进制化为十进制的方法即可。所不同的是每一位乘上一个底数为8的幂。

  • 658 = (6 × 81) + (5 × 80) = (6 × 8) + (5 × 1) = 5310
  • 1278 = (1 × 82) + (2 × 81) + (7 × 80) = (1 × 64) + (2 × 8) + (7 × 1) = 8710

1.5 二进制、八进制、十六进制互相转换

十进制 二进制 八进制 十六进制
0 0 0 0
1 1 1 1
2 10 2 2
3 11 3 3
4 100 4 4
5 101 5 5
6 110 6 6
7 111 7 7
8 1000 10 8
9 1001 11 9
10 1010 12 A
11 1011 13 B
12 1100 14 C
13 1101 15 D
14 1110 16 E
15 1111 17 F

1.6 二进制与十六进制互相转换

对于整数,将二进制按4位1组从右往左划分,对于小数,将二进制按4位1组从左往右划分每4位二进制对应十六进制1位,反之亦然,每1位十六进制对应4位二进制。

二进制 1 1 1 1
对应的值 8 4 2 1

也就是说,如有二进制数:10111000,计算过程如下:

将其分为两组:1011 1000,然后按位转化:

1011 => 8 + 2 + 1 = 11 = B

1000 => 8 = 8

所以十六进制结果是:(B8)~16~。

如果二进制位数不足4位,前补0计算,对于小数而言,方向相反。

如二进制:110111100.011001,加粗部分为所需补的0,计算过程如下:

整数部分:

将其分为三组:1 1011 1100,然后按位转化

0001 => 1 = 1

1011 => 8+2+1 = 11 = B

1100 => 8+4 = 12 = C

小数部分:

将其分为两组(注意方向的不同):0110 01

0110 => 4+2 = 6

0100 => 4

所以十六进制结果是:(1BC.64)~16~。

2.  位运算

2.1 取反(NOT)

取反是一元运算符,对一个二进制数的每一位执行逻辑反操作。使数字1成为0,0成为1。例如:

NOT 0111(十进制7)
 
  = 1000(十进制8)

许多程序设计语言取反操作符用波浪线"~"表示

2.2 按位或(OR)

按位或处理两个长度相同的二进制数,两个相应的二进位中只要有一个为1,该位的结果值为1。例如

   0101(十进制5)
OR 0011(十进制3)
 = 0111(十进制7)

在C类程序设计语言中,按位或操作符是"|"。

2.3 按位异或(XOR)

按位异或运算,对等长二进制模式或二进制数的每一位执行逻辑异或操作。操作的结果是如果某位不同则该位为1,否则该位为0。例如

    0101
XOR 0011
  = 0110

在类C语言中,按位异或运算符是"^"。

2.4 按位与(AND)

按位与处理两个长度相同的二进制数,两个相应的二进位都为1,该位的结果值才为1,否则为0。例如:

    0101
AND 0011
  = 0001

在类C语言中,按位与用'&'表示

2.5 移位

移位是一个二元运算符,用来将一个二进制数中的每一位全部都向一个方向移动指定位,溢出的部分将被舍弃,而空缺的部分填入一定的值。在类C语言中,左移使用两个小于符号"<<"表示,右移使用两个大于符号">>"表示。

应用逻辑移位时,移位后空缺的部分全部填0。

   0001(十进制1)
<<    3(左移3位)
 = 1000(十进制8)
   1010(十进制10)
>>    2(右移2位)
 = 0010(十进制2)