数的进制转化
进制的表示:二进制、十六进制,一般在题目中会给出中文说明,如果没给出,注意二进制的符号为0b,一般表示0b0011,十六进制符号为0x或H,可以表示为0x18F或18FH。
R进制整数转十进制:位权展开法,用R进制数的每一位乘于R的N次方,N是变量,从R进制数的整数最低位开始,依次为0,1,2,3....累加
二进制转八进制
每三位二进制数转换为一位八进制数,二进制数位个数不是三的倍数,则在前面补0(原则是数值不变)。
例如二进制 01101=001 101
001=1 101=1+4=5
01101=15
二进制转十六进制
每四位二进制转换为一位十六进制,二进制数位个数不是四的倍数,则在前面补0,
例如二进制101101 =0010 1101
0010=2 1101 = D
101101=2D
- 十进制转R进制使用短除法
列如将94转为二进制。
余数从下往上得到结果:1011110
以此类推,十进制转R进制,短除法处于R,取余数。
数的编码方式
带符号数有下列编码方式:
原码:一个数的正常二进制表示,最高位表示符号,数值0的原码有两种形式
+0(0 00000000)
-0 (1 00000000)
反码:正数的反码即原码;负数的反码在原码的基础上,除符号位外,其他各位按位取反。数值0的反码也有两种形式:
+0(0 00000000)
-0 (1 11111111)
补码:正数的补码即原码;负数的补码是在原码的基础上,除符号位外,其他各位安慰取反,而后末位+1,若有进位则产生进位。数值0的补码
+0=0 0000 0000
-0=1 0000 0000 = 1 1111 1111 +1 = 0 0000 0000
移码:用作浮点运算的阶码,无论正数负数,都是将该原码的补码的首位(符号位)取反得到移码。
PS:通常可以使用补码来进行加减运算。
机器字长为0时,各种码制表示的带符号数的取值范围(差别在于0的表示,原码和反码分+0和-0,补码只有有一个0,因为可以多表示一个)
举例
例如,我们这里使用4位机器字长来表示,为了理解方便,这里我用四个方框来表示4位二进制数。
默认最高位为符号位,如下所示。
这里我们先用4位二进制数表示定点整数,则最小值为1111,最大值为0111。
最小值1111表示如下。
其转换成10进制数为-7。
最大值0111表示如下。
其转换为10进制数为7。
这样,我们使用4位二进制数表示的范围,则可以计算出结果为:-7 ~ 7。也就是 -(2^4-1 - 1) ~ +(2^4-1 -1),所以,当使用n位二进制数表示数值的范围时,我们可以得出数据的表示范围为: -(2^n-1 - 1) ~ +(2^n-1 -1)
所以,我们根本就不需要记住定点整数和定点小数的取值范围表,只需要简单的使用一个实际的二进制位进行验算即可得出正确的结果数据。比如,我这里以4位二进制位进行验算举例。
还有一点需要注意的是:补码和移码比原码和反码少一个数,就是0。
浮点数表示
浮点数:表示方法为N=F*2^E,其中E称为尾数;类似于十进制的科学计数法
十进制如85.125=0.85125*10^2
二进制如101.011=0.101011*2^3
在浮点数的表示中,阶码为带符号的纯整数,尾数为带符号的纯小数,要注意符号占最高位(正数0负数1),其表示格式如下
很明显,与科学计数法类似,一个浮点数的表示方法不是唯一的,浮点数所能表示的数值范围由阶码确定,所表示的数值精度由尾数确定。
尾数的表示采用规格化方法:
即带符号尾数的补码必须为1.0xxxx(负数)或者0.1xxxx(正数),其中x可为0或1
浮点数的运算:
对阶 > 尾数计算 > 结果格式化
对阶:使两个数的阶码相同,小阶向大阶看齐,较小阶码增加几位,尾数就右移几位
尾数计算:相加,若是减运算,则加负数
结果规格化:即尾数表示规格化,带符号尾数转换为1.0xxxx或0.1xxxx
浮点的运算
数与数之间的算术运算包括加、减、乘、除等基本算术运算,对于二进制数,还应该掌握基本逻辑运算,包括:
逻辑与&&:0和1相与,只要有一个为0结果就为0,两个都为1才为1.
逻辑或||:0和1相或,只要有一个为1结果就为1,两个都为0才为0
异或:同0非1,即参加运算的二进制数同为0或者同为1结果为0,一个为0另一个为1结果为1.
逻辑非!:0的非是1,1的非是0
逻辑左移<<:二进制数整体左移N位,高位若溢出则社区,低位补0
逻辑右移>>:二进制数整体右移N位,低位溢出则舍去,高位补0