C++位操作 进制转换浅谈

来源:互联网 发布:左左网源码 编辑:程序博客网 时间:2024/06/03 23:49



这里不可能把每个细节都讲那么细,谨以此一例概之,读者只需要拓展即可。

/***************************************************************************************************************************************************************************************/

好,就从此开始吧。



对于一个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;}}


原创粉丝点击