进制之间转换
二进制、八进制、十六进制等转换成十进制
概念:位置计数法
以十进制为例
(N)10=an-1 × 10n-1 + an-2 × 10n-2+…+ a1 × 101 + a0 × 100 + a-1 × 10-1 + a-2 × 10-2 +…+ a-m × 10-m
式中,ai表示各个数字符号为0~9这10个数码中的任意一个,n为整数部分的位数;m为小数部分位数
其他进制方式类似,只需把10换成相对应的进制数
二进制表示
(N)2=an-1 × 2n-1 + an-2 × 2n-2+…+ a1 × 21 + a0 × 20 + a-1 × 2-1 + a-2 × 2-2 +…+ a-m × 2-m
例1:(1234.56)10=1 × 103 + 2 × 102 + 3 × 101 + 4 × 100 + 5 × 10-1 + 6 × 10-2
例2:(101101)2=1 × 25 + 0 × 24 + 1 × 23 + 1 × 22 + 0 × 21 + 1 × 20 = (45)10
例3:(11010.101)2=1 × 24 + 1 × 23 + 0 × 22 + 1 × 21 + 0 × 20 + 1 × 2-1 + 0 × 2-2 + 1 × 2-3 = (26.626)10
十进制数转换成二进制、八进制、十六进制等
十进制转换为二进制
- 整数部分转换
把要转换的十进制数的整数部分不断除以基数2,并记下余数,直到商为0为止。
(N)10 = (117)10 117 / 2 = 58 (a)0=1 最低整数位 58 / 2 = 29 (a)1=0 29 / 2 = 14 (a)2=1 14 / 2 = 7 (a)3=0 7 / 2 = 3 (a)0=1 3 / 2 = 1 (a)0=1 1 / 2 = 0 (a)0=1 最高整数位 (117)10 = (1110101)2
- 小数部分转换
对于被转换的十进制数的小数部分则应不断乘以基数2,并记下其整数部分,直到结果的小数部分为0或达到一定的精度为止。
(N)10 = (0.8125)10 0.81252 = 1.625 (b1)=1 最高小数位 0.6252 = 1.25 (b2)=0 0.252 = 0.5 (b3)=0 0.52 = 1.0 (b4)=4 最低小数位 所以,(N)10 = (0.1101)2 注意:对于小数部分的转换式中的整数不参加连乘,第一次乘以2所得到的整数部分是二进制数小数的最高位,最后所得到的整数部分是二进制数小数的最低位。
在十进制数的小数部分转换中,有时连续乘以2不一定能使小数部分等于0,这说明该十进制小数不能用有限位二进制小数表示。这时,只要取足够多的位数,使其误差达到所要求的精度就可以了。
<b><font color=red>十进制数转换成二进制数的这种方法其实也适用于十进制转换成其他进制数,只是基数不再是2,而是要转换的进制数的基数。</font></b>
下面的例子是将一个十进制数转换成八进制数
<pre>
复制代码
(N)10 = (117)10
117 / 8 = 14 (a)0=5 最低整数位
14 / 8 = 1 (a)1=6
1 / 2 = 0 (a)2=1 最高整数位
(117)10 = (165)8
<pre>
复制代码
(N)10 = (0.8125)10
0.81258 = 6.5 (b1)=6 最高小数位
0.58 = 4.0 (b2)=4 最低小数位
所以,(N)10 = (0.64)8
二进制数转换成八进制
从小数点开始,分别向左、右按3位分组转换成对应的八进制数字字符,最后不满3位的,则需要补0(整数部分最高位补0,小数部分最低位后补0)。
例:将(1101101.10101)2转换成八进制数。
二进制数:001 101 101 . 101 010
八进制数:1 5 5 . 5 2
所以 (1101101.10101)2 = (155.52)8
八进制数转换成二进制
将每位八进制数用3位二进制数表示即可。
八进制数:3 4 5 . 6 4
二进制数:011 100 101 . 110 100
(345.64)8 = (11100101.1101)2
二进制数转换成十六进制数
从小数点开始,分别向左、右按4位分组转换成对应的十六进制数字字符,最后不满4位的,则需补0(整数部分最高位前补0,小数部分最低位后补0)。
例:将(11011101.10101)2转换成十六进制数。
二进制数:0110 1101 . 1010 1000
十六进制数:6 D . A 8
(1101101.10101)2 = (6D.A8)16
十六进制数转换成二进制数
将每位十六进制数用4位二进制数表示即可。
例:将十六进制数(A8D.6C)16转换成二进制数。
十六进制数:A 8 D . 6 C
二进制数:1010 1000 1101 . 0110 1100
(A8D.6C)16 = (101010001101.011011)2
真值与机器数
一般,直接用正号”+”和负号”-“来表示符号的二进制数,叫做符号数的真值。例:+1011、-1011
把一个数连同其符号在内的机器中的表示加以数值化,这样的数称为机器数。一般用最高位有效位来表示数的符号,正数用0表示,负数用1表示。例:+1011的机器数为01011、-1011的机器数为11011
原码
原码又称为“符号-数值表示”。在以原码形式表示的正数和负数中,第一位表示符号位,对于正数,符号位记为0,对于负数,符号位记为1,其余各位表示数值部分。
假如两个带符号的二进制数分别为N1和N2,其真值形式为:
N1 = +10011 N2 = -01010
则N1和N2的原码表示形式为:
[N1]原 = 010011 [N2]原 = 101010
反码
反码又称为“对1的补数”。用反码表示时,左边第一位也是符号位,符号位为0代表正数,符号位为1代表负数,对于负数,反码的数值是将其原码数值按位求反得到的,而对于正数其反码和原码相同。
假如两个带符号的二进制数分别为N1和N2,其真值形式为:
N1 = +10011 N2 = -01010
则N1和N2的反码表示形式为:
[N1]反 = 010011 [N2]反 = 101010
补码
补码又称为“对2的补数”。在补码表示法中,正数的补码表示同原码和反码的表示是相同的,而负数的补码表示却不同。对于负数的补码,其符号位为1,而数值部分是将其原码数值部分“按位求反,末位加1”而得到的。
假如两个带符号的二进制数分别为N1和N2,其真值形式为:
N1 = +10011 N2 = -01010
则N1和N2的补码表示形式为:
[N1]补 = 010011 [N2]补 = 110110
补码的加、减运算
由补码的定义可以证明如下补码加、减运算规则:
[N1+N2]补=[N1]补+[N2]补
[N1-N2]补=[N1]补+[-N2]补
补码的加、减运算规则表明:两数和的补码等于两数的补码之和,而两数差的补码也可以用加法来实现。运算时,符号位和数据位一样参加运算,如果符号位产生进位,则需要将此进位“丢掉”。运算结果的符号位为0时,说明是正数的补码;运算结果的符号为1时,说明是负数的补码。
例:已知N1=+10011,N2=-01010,求[N1+N2]补和[N1-N2]补
解:[N1]补=010011 [N2]补=110110 [-N2]补=001010
[N1+N2]补=[N1]补+[N2]补=010011+110110
010011
+ 110110
丢掉←1 001001
由于符号位产生了进位,因此,要将此进位丢掉,即[N1+N2]补=001001,运算结果的符号位为0,说明是正数的补码,故其真值为N1+N2=+01001。
又[N1-N2]补=[N1]补+[-N2]补=010011+001010
010011
+ 001010
011101
即[N1-N2]补=011101,运算结果的符号位为0,说明是正数的补码,故其真值为N1-N2=+11101。
二进制数的位运算
- “与”运算(AND)
“与”运算又称为逻辑乘,可用符号” • ”或“ Λ ”来表示,C语言中用“&”来表示。
2. “或”运算(OR)
“或”运算又称为逻辑加,可用符号“+”或“ ∨ ”来表示,C语言中用“|”来表示。
3. “非”运算(NOT)
“非”运算又称逻辑反,可用符号“ ¬ ”来表示,C语言用“~”表示。
4. “异或”运算(XOR)
“异或”运算可用符号“ ⊕ ”来表示,C语言中用“ ^ ”表示。
如图所示
A | B | A & B |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
A | B | A | B |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
A | ~ A |
---|---|
0 | 1 |
1 | 0 |
A | B | A ^ B |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |