首页 > 解决方案 > 将十进制转换为十六进制时一次只考虑 4 位

问题描述

我有一个将十进制转换为十六进制字符串的 C 函数hexConversion

int hexConversion(int num){
    char hex_buffer[9];
    unsigned int mask = 4026531840;
    for(int i = 0; i < 9; i++){
        int temp = mask & num;
        if(temp < 10){
            hex_buffer[i] = temp + '0';
        }
        else if(temp == 10){
            hex_buffer[i] = 'A';
        }
        else if(temp == 11){
            hex_buffer[i] = 'B';
        }
        else if(temp == 12){
            hex_buffer[i] = 'C';
        }
        else if(temp == 13){
            hex_buffer[i] = 'D';
        }
        else if(temp == 14){
            hex_buffer[i] = 'E';
        }
        else if(temp == 15){
            hex_buffer[i] = 'F';
        }
        mask >>= 4;
    }

    hex_buffer[8] = '\0';

    for(int i = 0; i < sizeof(hex_buffer); i++){
        printf("%c", hex_buffer[i]);
    }
}

带驱动代码:

int main(){
    hexConversion(2);
    hexConversion(255);
    hexConversion(-1);
    hexConversion(INT_MAX);
    hexConversion(INT_MIN);
    hexConversion(0xDEADBEEF);
}

我的输出是: 00000002 0000000F 0000000F 0000000F 00000000 0000000F

每个输出的最后一个值都是正确的,但最后一个值之前的所有值都没有计算。我相信这是因为 mytemp = mask & num没有产生不是 0-15 的值。我的问题是,我如何一次只考虑 4 位,以便我的所有temp值都在这个范围内?

标签: cfunctionbinaryhexoutput

解决方案


这取决于您的系统,但是如果您想从您的值中提取 nybbles,您最终可以在您的值上应用 0xF (masks >> (4 * n)) 例如,如果我得到一个看起来像这样的二进制数据 0x4602 = 0100 0110 0000 0010 并且我需要提取只有这个的第一部分我可以0xF000 = 1111 0000 0000 0000在这个 0x4602 上使用带有 & 掩码的 a 来获得这个值的第一部分这会给我们 0xF000 = 1111 0000 0000 0000 &0x4602 = 0100 0110 0000 0010 result would be 0x4000 = 0100 0000 0000 0000

要获得该值的第 n 部分,您可以将 (0xF000) 与 >> 4 n 次


推荐阅读