计算机中的存储数据
生活中计算数据的时候是按照十进制规则来进行的,十进制的规则是逢十进一
十进制的符号是由0-9组合成的
而计算机中数据存储运算的时候,采用的是二进制,二进制只有符号0和1,规则是逢二进一
常见的进制形式
二进制、八进制、十进制、十六进制
二进制(0b -- binary)符号集只有 0 和 1
八进制(0o -- octal)符号集 从 0 到 7
十进制 符号集是 0到9
十六进制(0x -- hexadecimal) 符号集为数字 0 到 9,字母a到f,10则使用a来表示,f表示15 【字母大小写都可以】
进制转换
二进制和十进制之间的转换
二进制转十进制
规则:按权展开求和
以十进制为例:
比如数字5678 = 5 * 1000 + 6 * 100 + 7 * 10 + 8 * 1
【1000/100/10/1都是基于本进制对应位置的权值】
= 5 * 10^3 + 6 * 10^2 + 7 * 10^1 + 8 * 10^0
每位上的权值 = 进制^(位数-1)
按照上面的规则,二进制上每位的权值 = 2^(位数-1)
比如:0b1011
= 1*2^0 + 1 * 2^1 + 0*2^2 + 1 * 2^3
= 1 + 2 + 0 + 8
= 11
因为二进制的符号集只有0和1,而0乘以任何数为0,1乘以任何数为数字本身,可以假设所有位置上都是1,二进制数据每位的权值从右到左为1、2、4、8、16、32、64......
所以可以得出另一个方法:
将数据减去离它最近且小于它的2幂数,将差值继续操作,直到插值为0,统计2的幂数有哪些,随后按照从右到左的位置,该位置有幂数的为1,无则为0:
例如 69: = 0b1000101
69 - 64 = 5
5 - 4 = 1
1 - 1 = 0
按照从右到左的顺序,64 32 16 8 4 2 1
64 32 16 8 4 2 1
1 0 0 0 1 0 1
有的地方为1,没有则为0,所以最后结果为0b1000101
十进制转二进制
整数转换规则
将数据除以2取余数,再将得到的商重复这个操作,直到商为0,将所有的余数逆向拼接,结果就是二进制数据
示例:68:
68/2=34 ---商为34,余为0
34/2=17 ---商为17,余为0
17/2=8 ---商为8,余为1
8/2=4 ---商为4,余为0
4/2=2 ---商为2,余为0
2/2=1 ---商为1,余为0
1/2=0 ---商为0,余取1
将最后结果逆向拼接 为 1 0 0 0 1 0 0 则十进制68转二进制结果为0b1000100
小数部分转换规则
将数据乘以2取整数部分,再将积的小数部分乘以2取整数部分,重复此操作,直到小数部分为0,将整数部分正序拼接在一起
示例:
0.175:
0.175 * 2 = 0.25--整数部分为0,所以取0
0.25 * 2 = 0.5--整数部分为0,所以取0
0.5 * 2 = 1.0--小数部分为0,结束操作;整数部分为1,所以取1
正序拼接在一起,最终结果为 0b.001
如果数据为68.175,转换为二进制则先把68和0.175分开计算,将结果加在一起,为0b1000100.001
二进制和八进制之间的转换
八进制最大的数字是7,7转化为二进制为0b111,最大的数字为三位,所以其他的数字三位足够满足。
二进制转八进制
转换规则:将二进制数据从右向左每三位一分,左边不足3位在前面补0, 将分出的每一份按权展开求和,将和从左向右拼接在一起就是八进制
示例:
0b110111011
每三位一分 为 110 111 011
按权求和展开分别为 6 7 3
从左到右拼接在一起结果为 0o673
八进制转二进制
转换规则:将每位数转化为三位二进制数,将结果拼接在一起即可
示例:
0o6754
6 --- 0b110
7 --- 0b111
5 --- 0b101
4 --- 0b100
正序拼接在一起 结果0b110 111 101 100
十六进制和二进制之间的转换
二进制转十六进制
十六进制最大的数字为f(15),15转化为二进制为四位数(0b1111),所以最大的数字需要四位,其他数字四位足以满足
规则:和八进制转换大抵差不多少,是将二进制数据从右向左每四位一分,左边不足4位前面补0, 将分出的每一份按权展开求和,将和从左向右拼接在一起就是十六进制
示例: 0b110011010101
每四位一分 1100 1101 0101
按权求和展开分别为 12(c) 13(d) 5
从左到右拼接在一起为 0x cd5
十六进制转二进制
规则:和八进制转换也差不多少,只不过变成四位一分。将每位数转化为四位二进制数,将结果拼接在一起即可
示例:0x8ac2
8 = 0b1000
a = 0b1010
c = 0b1100
2 = 0b0010
拼接在一起为0b 1000 1010 1100 0010
八进制转十进制
0o345 = 5*8^0 + 4*8^1 + 3*8^2
= 5 + 32 + 192
= 229
直接从右到左按权展开求和
十进制转八进制
数据除以8取余数,再用得到的商除以8取余数直到商为0,最后 将余数逆向拼接
示例:98
98/8=12--商为12余数为2
12/8=1 --商为1余数为4
1/8 =0--商为0余数取1
逆向拼接为0o 142
十六进制转十进制
0xcb = 11 * 16^0 + 12 * 16^1
= 11 + 192 = 203
也是从右到左按权求和
十进制转十六进制
规则:数据除以16取余数,再用商除以16取余数直到商为0,将余数逆向拼接
示例: 255
255/16 =15 -- 商为15余数为15
15/16 =0 -- 商为0余数为15
将余数逆向拼接得到结果为0xff
八进制和十六进制之间的转换
规则:八进制和十六进制之间的转换需要以二进制为桥梁进行操作【先转二进制,再做转换】
示例: oxff
转化为二进制为0b011 111 111
二进制转化为八进制为0o377
使用python写一个快捷的进制转换
src = int(input('请输入数据的进制,比如2、8、10、16:'))
# 如果原始数据进制非2、8、10、16则提示没有该机制
if src == 2 or src == 8 or src == 16 or src == 10:
# 数据是谁
data = input('请输入数据:')
# 目标的进制是谁
dest = int(input('请输入转数据的进制,比如2、8、10、16:'))
"""
把数据转化为二进制 操作是bin(整数)
八进制 oct (整数)
十六进制hex(整数)
十进制int(可以为整数也可以为字符串)
int(字符串,base=数据是几进制的)
"""
# 想要完成这个操作 需要先把数据转换十进制
decade_num = int(data,base=src)
# 需要判断目的进制是什么 然后做相应的转换
if dest == 2:
result = bin(decade_num)
elif dest == 8:
result = oct(decade_num)
elif dest == 16:
result = hex(decade_num)
elif dest == 10:
result = decade_num
else:
result = '无此进制转换机制'
print('转化结果为:',result)
else:
print('无法转换此进制数据')