前几天面试时候遇到的问题:

给定一个十六进制字符串"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
最后修改:2018 年 12 月 16 日
喜欢就给我点赞吧