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



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

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

好,就从此开始吧。



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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值