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
十进制转换为其他进制,一句话方法:整数部分——除基取余,倒序拼接余数;对于小数部分——乘基取整,正序拼接整数。
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 |
十进制 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 |
二进制 | 1011 | 1100 | 1101 | 1110 | 1111 | 10000 | 10001 | 10010 | 10011 | 10100 | 10101 |
十进制 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 |
二进制 | 10110 | 10111 | 11000 | 11001 | 11010 | 11011 | 11100 | 11101 | 11110 | 11111 | 100000 |
十进制 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 |
二进制 | 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)