这里不可能把每个细节都讲那么细,谨以此一例概之,读者只需要拓展即可。
/***************************************************************************************************************************************************************************************/
好,就从此开始吧。
对于一个32位的unsigned int来说。它所能表示的最大值是二进制的11111111111111111111111111111111(2),十六进制的FFFFFFFF(16)
对于二进制到十六进制的转换你可以发现二进制有32位,16进制有8位。从本质上来讲。二进制的每四位对应16进制的每一位。同样若是八进制。每三位对应其一位。
十六进制0x0000efa8对应二进制为:0000 0000 0000 0000 1110 1111 1010 1000(2)。因为e->1110 f->1111 a->1010 8->1000
在C++中。数值默认是用十进制表示的。
所以0x0000efa8这个数,如果赋给一个unsigned int 类型,其输出一定是我们所见的十进制,只不过我们分析的时候,是以其它进制的形式分析。
假设我们要将这个十进制转成16进制。
那么依次每四位取。
0x0000efa8 & 0xf;(取前四位) ----------------------------————--> 0x00000008 -------->8
0x0000efa8>>4 & 0xf;(取前五至八位) 即 0x00000efa & 0xf ---> 0x0000000a -------->10
0x0000efa8>>8 & 0xf;(取前九至12位) 即 0x000000ef & 0xf ---> 0x0000000f -------->15
0x0000efa8>>12 & 0xf;(取前13至16位)即 0x0000000e & 0xf ---> 0x0000000e ---->14
此时的数全部是0-15以内的数。可以根据一对一的关系算出对应的char
10-->'a'
11-->'b'
.....
15-->'f'
再将这些字符按照一定的规律整理可得相应16进制字符串。
上代码。。分析之
char * DecToHex(unsigned int srcInt)
{
char * buffer=new char[9];//申请9个字符的空间,以'\0'结尾
int i = 0;
while (i<8)//将各位求出
{
buffer[3-i]=DecToChar(srcInt>>(4*i)&0xf);
i++;
}
buffer[8]=0;
return buffer;
}
char DecToChar(unsigned int srcInt)
{
if (srcInt<0||srcInt>16)
{
return NULL;
}
if (srcInt>=0&&srcInt<=9)
{
return srcInt+'0';
}
else
{
return srcInt + 'A' -10;
}
}