前几天面试时候遇到的问题:
给定一个十六进制字符串
"AB"
,转换成十六进制的整数0xab
输出。
临时接到的面试通知,赶场子过去一坐下就给个题目,说实话面试了一两个星期是第一次做这方面的面试题。没有思想准备,当时脑海里就闪过两个念头,一个是左移,一个是直接进制转换。
回来之后想了一下,通过左移操作完成了这个代码:
#include<stdio.h>
#define MAX_SIZE sizeof(int) // 一个int型数据的大小
// 这里最好保证数据输入合法
int get_int(char c){
if (''0'' <= c && c <= ''9'') {
return c - ''0'';
} else if (''A'' <= c && c <= ''F''){
return 10 + c - ''A'';
} else if (''a'' <= c && c <= ''f''){
return 10 + c - ''a'';
} else {
return -1;
}
}
int convert_f1(char *str){
int e = 0, t;
int idx = 0;
char *p = str;
while(*p) {
t = get_int(*p);
<tab>if (t == -1) return -1;
// 一个数据过来,先左移四个字节然后或
// 一个十六进制数据站4位,相当于把这个新来的加在最末尾
e = (e << 4) | t;
p++;
idx++;
}
if (idx > MAX_SIZE * 2) {
// 判断长度是否超出int的上限
return -1;
} else {
return e;
}
}
int main(int argc, char** argv){
if (argc < 2) {
printf("Usage: ./app AB 1A ...\n");
return 0;
}
int i, x;
for (i = 1; i < argc; i++) {
x = convert_f1(argv[i]);
if (x == -1) {
printf("Invalid input [%s]\n", argv[i]);
} else {
printf("%s --> 0x%X\n", argv[i], x);
}
}
return 0;
}
测试结果
$ ./app aaff ddee abcdef12
aaff --> 0xAAFF
ddee --> 0xDDEE
abcdef12 --> 0xABCDEF12
此处评论已关闭