C++进制转换的实例
一个面试题,要求输入十进制数,输出十六进制,可以使用printf打印%d,%c,%s来输出,但不能使用 %x 打印。
写了两种算法,还算比较简洁,粘贴在此。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
// 第一种算法,从低位到高位扫描移位,需要一个数组辅助倒序,一次性输出结果
#include <stdio.h>
#define MAX_HEX_NUM 16
#define OUT_DATA_LEN sizeof(int)*2 // 2个16进制数表示1个字节
static char Hex_Char_Table[MAX_HEX_NUM] = {
'0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' , 'A' , 'B' , 'C' , 'D' , 'E' , 'F'
};
int ten2hex( int data )
{
char result[OUT_DATA_LEN+1];
int i,index;
result[OUT_DATA_LEN] = '\0' ;
for ( i=OUT_DATA_LEN-1; i>=0; i-- )
{
index = data & 0xf;
result[i] = Hex_Char_Table[index];
data = data>>4;
}
printf ( "0x%s\n" ,result);
return 0;
}
|
下面是第二种算法,从高位向低位扫描,得到结果直接打印。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
#include <stdio.h>
#define BITS_OF_INT sizeof(int)*8 // int的位数
#define OUT_DATA_LEN sizeof(int)*2 // 2个16进制数表示1个字节
int printHex( int num )
{
int i;
printf ( "0x" );
for (i=0;i<OUT_DATA_LEN;i++)
{
unsigned int res = num & 0xf0000000; //注意,必须用 unsigned int来接收,否则当输入负数的时候会转换错误
res = res >> (BITS_OF_INT-4);
char c;
if ( res <= 9 )
c = res + '0' ;
else
c = 'A' + res - 10;
printf ( "%c" ,c);
num = num << 4;
}
printf ( "\n" );
}
|
两种算法其实都是采用移位的方式来运算,而不是采用除法,这样会更加高效一些,我想这个题目的考点应该也在这里吧。
服务器之家推荐一款在线任意进制转换工具:https://tool.zzvips.com/t/hex/ 有需要的朋友可以去看看。
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
原文链接:http://ticktick.blog.51cto.com/823160/844191