10进制转16进制算法
最近在研究 pdm产品研发数据管理系统,由于这套系统的文件数据ID号是10进制的,想要找到具体的物理文件,只能转换为16进制,所以研究了一下算法,分享给大家: 十六进制(简写为hex或下标16),在数学中是一种逢16进1的进位制。通常用0-9,a-f(或A-F)表示16个基数,即0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F表示0-15。如:十六进制数1F,F是个位数表示15,1是十位数表示1个16,那么它转换为十进制数即为31,16+15=31。16进制数是计算机中常用的进数制,比如颜色代码#、码U+200D等都可用16进制数表示。
10进制转16进制可以使用10进制数转换为任意进制数算法:
整数部分/n取余,得到整数部分/n再取余二进制转16进制,直到整数部分/n小余1,把余数从下到上排列得到转换后的整数部分。小数部分*n取整,得到余下的小数部分*n再取整,直到整小数部分为0(很多时候小数部分会无限长,通常我们只取前n位数,取的位数越长精度越高),。其中n表示n进制数,如转为16进制n=16,转为8进制n=8。
如10进制数1234.567转为16进制数,计算过程如下:
整数部分
1234/16 = 77 余 2
77/16 = 4 余 13(D)
4/16 = 0 余 4
把余数从下往上排列得4D2。
小数部分
0.567*16 = 9.072 取整 9
0.072*16 = 1.152 取整 1
0.152*16 = 2.432 取整 2
0.432*16 = 6.912 取整 6
......
此处我们只取4位,把取整的数从上到下排列得到9126。
整数部分和小数部分都计算出来了然后把它们结合在一起得到4D2.9126,所以10进制数1234.567转为16进制数为4D2.9126。
16进制转10进制可以使用任意进制转十进制公式:
abcd.efg(n) = d*n^0 + c*n^1 + b*n^2 + a*n^3 + e*n^-1 + f*n^-2 + g*n^-3(10)
其中abcd.efg是n进制数,n表示任意制。即对应数位的基数码乘该位的权得到一个10进制数,每个数位的计算结果相加即为10进制数。
如:
1F1F =(1*16^3)+(15*16^2)+(1*16^1)+(F*16^0) = 4096+3840+16+15 = 7967
1*16^3表示1乘16的3次方,计算出来就是4096。15*16^2表示15乘16的2次方二进制转16进制,计算出来就是3840。依此类推,计算各项结果相加就是7967。所以十六进制数1F1F转换为十进制数为7967。
又如:
1F.1F = (1*16^1)+(F*16^0)+(1*16^-1)+(F*16^-2) =16 +15 + 0.0625 + 0. = 31.
1*16^1表示1乘16的1次方,计算出来就是16。F*16^0表示15乘16的0次方,计算出来就是15。1*16^-1表示1乘16的负1次方,计算出来就是0.0625。F*16^-2表示15*16的负2次方,计算出来就是0.。各项相加就是31.。所以十六进制数1F.1F转换为十进制数为31.。