数据结构:进制转换
计算机的内存都是以二进制的形式进行数据存储:
>>以十进制为参考点:
1.十进制转二进制:39(10)=100111(2)
例:39/2 = 19 1
19/2 = 9 1
9/2 = 4 1
4/2 = 2 0
2/2 = 1 0
1/2 = 1 1
从下往上数100111
???数转换的特征
10→2: (57.75)10 = (111001.110)2
整数部分 57/2 1 小数部分
0.75*2 1
28/2 0 (1.5-1)*2 取 1
14/2 0 (1.0-1)*2 取0
7/2 1
3/2 1
1/2 1
于小数部分的一定要正取,整数部分的要逆取。
2. 十进制转八进制:358(10)=546(8)
例:358/8 = 44 6
44/8 = 5 4
5/8 = 0 5
3. 十进制转16进制:120(10)=78(16)
例:120/16 = 7 8
7/16 = 0 7
特征:
>>其他进制转十进制:
1. 二进制转十进制:
111101(2)= 1*2的0次方+ 0*2的1次方 + 1*2的2次方 + 1*2的3次方 + 1*2的4次方 + 1*2的5次方
= 1*1+ 0*2+ 1*4+1*8+ 1*16 +1*32
= 1+ 0 + 4+ 8+ 16+ 32
= 61(10)
例:01.101(2)=?(10)
开始把0.101转换成10进制的。
小数点后面的“1”,处于负一位,后面的“0”处于负二位,在后面的“3”处于负三位,
因为是2进制的转换成10进制的,那么0.101=1*2的-1次方+0*2的-2次方+1*2的-3次方=0.5+0+0.125=0.625
将整数部分的和小数部分的相加,5+0.625=5.625 即101.101(2)=5.625(10)
8进制,16进制转换10进制,将“1*2的-1次方+0*2的-2次方+1*2的-3次方”里面的乘号后面的“2”分别换成“8”和“16”就好了。其余的都雷同上述。
2. 八进制转十进制:
224(8)=148(10)
224:
第0位 4*8的0次方 = 4
第1位 2*8的1次方 =16
第2为 2*8的2次方 =128
3. 16进制数转换成10进制数
2AF5(16)=10997(10)
16进制数2AF5的第0位为“5”,第1位为“F”, 第2位为“A” 第3位为“2”
第0位 5*16的0次方 =5
第1位 F*16的1次方 =240
第2位 A*16的2次方 =2560
第3位 2*16的3次方 =8192
@7
在2进制中只有2个数字,既1,0
在8进制中只有8个数字,既0,1,2,3,4,5,6,7
在10进制中有10个数字,既0,1,2,3,4,5,6,7,8,9
在16进制中有10个数字和6个字母,既0,1,2,3,4,5,6,7,8,9和A,B,C,D,E,F,
字母A代表数字10,字母B代表数字11,字母C代表数字12,字母D代表数字13,字母E代表数字14,字母F代表数字15,
>>二进制转换16进制:
1.制转换为十六进制,因为2的4次方等于16,所以4个二进制就等于一个十六进制。
1001=1*2的0次方+1*2的3次方=9
1111=1*2的0次方+1*2的1次方+1*2的2次方+1*2的3次方=15=F
1110=1*2的1次方+1*2的2次方+1*2的3次方=14=E
0001=1*2的0次方=1
1111011111001=1EF9
原理: 四位二进制数写成: b3 b2 b1 b0
1 --- 有一个 1 (2^0 =1)
1 --- 有一个 2 (2^1=2)
1 --- 有一个 4 (2^2=4)
1 --- 有一个 8 (2^3=8)
这叫作权 (8,4,2,1)
就如同十进制数的个十百千一样。
二进制 十进制 16进制
0000=0=0
0001=1=1
0010=2=2
0011=3=3
0100=4=4
0101=5=5
0110=6=6
0111=7=7
1000=8=8
1001=9=9
1010=10=A (10)
1011=11=B (11)
1100=12=C (12)
1101=13=D (13)
1110=14=E (14)
1111=15=F (15)
2.制转换八进制:
二进制 数可以用1位 八进制 数表示
列表如下
二进制 八进制
000 0
001 1
010 2
……
111 7
如果是多位,就从低向高数,每3位二进制数分在一组,表示一个八进制数,比如二进制1011表示为八进制为13,二进制011001111表示为八进制为317
>>负数的二进制表示方法
假设有一个 int 类型的数,值为5,那么,我们知道它在计算机中表示为:
00000000 00000000 00000000 00000101
5转换成二制是101,不过int类型的数占用4字节(32位),所以前面填了一堆0。
现在想知道,-5在计算机中如何表示?
在计算机中,负数以其正值的补码形式表达。
什么叫补码呢?这得从原码,反码说起。
原码:一个整数,按照绝对值大小转换成的二进制数,称为原码。
比如 00000000 00000000 00000000 00000101 是 5的 原码。
反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码。
取反操作指:原为1,得0;原为0,得1。(1变0; 0变1)
比如:将00000000 00000000 00000000 00000101每一位取反,得11111111 11111111 11111111 11111010。
称:11111111 11111111 11111111 11111010 是 00000000 00000000 00000000 00000101 的反码。
反码是相互的,所以也可称:
11111111 11111111 11111111 11111010 和 00000000 00000000 00000000 00000101 互为反码。
补码:反码加1称为补码。
也就是说,要得到一个数的补码,先得到反码,然后将反码加上1,所得数称为补码。
比如:00000000 00000000 00000000 00000101 的反码是:11111111 11111111 11111111 11111010。
那么,补码为:
11111111 11111111 11111111 11111010 + 1 = 11111111 11111111 11111111 11111011
所以,-5 在计算机中表达为:11111111 11111111 11111111 11111011。转换为十六进制:0xFFFFFFFB。
再举一例,我们来看整数-1在计算机中如何表示。
假设这也是一个int类型,那么:
1、先取1的原码:00000000 00000000 00000000 00000001
2、得反码: 11111111 11111111 11111111 11111110
3、得补码: 11111111 11111111 11111111 11111111
可见,-1在计算机里用二进制表达就是全1。16进制为:0xFFFFFF
>>二进制的运算方法:
二进制数的运算方法 同十进制都属于 进位 运算方法,它们有类似的地方,当然也有不同的地方,二进制下只有加法。乘法和减法是变相的加法,除法只是简单地移位。
首先,简单的说明一下,什么是进位 运算方法? 十进制含有的数是 0 1 2 3 4 5 6 7 8 9 十个数, 而二级制只有两个数 0 1
比方说十进制数1234=1x10^3 + 1x10^2 + 3x10^1 + 4x10^0
其中1 2 3 4 分别居在 千位 十位 百位 个位 。
同样的二进制数 里也存在一样的位制
二进制化十进制
二进制的1010 =1 x 2^3+ 0 x 2^2 + 1 x 2^1+ 0 x 2^0 = 10 (十进制)
同 理十进制化为二进制 :10(10)=1 x 2^3+ 0 x 2^2 + 1 x 2^1+ 0 x 2^0 =1010(2)因为我们不能较快的获 得有多少个 2^0 2^1 2^2 2^3 2^4 2^5 2^6 ........2^n 所以才有短除法这一形式来辅助运算 除2取 余法
10/2=5.......0
5/2=2........1
2/2=1........0
1/2=0........1 把结果倒过来写就是1010了
以上是进制的转换。
加法:
下面就是加法的运算
十进制下有 二进制下就有
1234 1011
+ 2846 + 1111
—--.--.—--- ------.-.-.------
4080 11010
总的来说 二进制下和是十进制的运算时一样的,
十进制下满十进一,二进制下满二进一。
减法 有两种方式 以下是特殊情况 注意第一位是符号位。 0代表正数, 1 代表负数
。。 另一种方式是吧减法当成加上一个负数
0 1 0 0 1 0 1001
- 0 1 1 1 1 《===》 + 1 0001
---------------- ------------------。------
1 1 0 1 0 算的结果是负数 1 1010
负数与成正数互化就是取反加一
取反 0 1 0 1
+ 1
---------------
负的 0 1 1 0 =负的 0x2^3+1x^2+1x2^1+0x2^0= 负6
表示方法是取反加一 前面的第一位是符号位 1 代表负数 1 1110
乘法111x111= 1 1 1
x 1 1 1
--------------------------------
1 1 1
1 1 1
+ 1 1 1
-----------------------------------
1 1 0 0 0 1
除法:
1 1 1 1 / 1 0= 111
1111 / 11 = 101
除法和十进制的出发类似 不同的是这里是不会出现小数的 就像例子中的1 1 1 1 / 1 0= 111 化成十进制是 15除以2 但是结果却是111=7 因为那个余数1 已经被挤出去了,这里涉及到了计算机的内存问题 这就不深究 知道怎么算就好了
以0x开始的数据表示16进制,计算机中每位的权为16,即(16进制)10 = (10进制)1×16