前几天面试时候遇到的问题:
给定一个十六进制字符串
"AB"
,转换成十六进制的整数0xab
输出。
临时接到的面试通知,赶场子过去一坐下就给个题目,说实话面试了一两个星期是第一次做这方面的面试题。没有思想准备,当时脑海里就闪过两个念头,一个是左移,一个是直接进制转换。
回来之后想了一下,通过左移操作完成了这个代码:
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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
#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; } |
测试结果
1 2 3 4 |
$ ./app aaff ddee abcdef12 aaff --> 0xAAFF ddee --> 0xDDEE abcdef12 --> 0xABCDEF12 |
评论