无符号到十六进制数字

时间:2013-04-12 15:46:55

标签: c bit-manipulation hex

我遇到了一个问题:基于unsigned int形成一个字符数组。 Array将以十六进制表示法表示该int。使用按位运算符执行此操作。

所以,我的想法如下:我创建了一个掩码,其4个最低值位有1个。 我将给定int的位向右推4并使用&在那个int和mask上。我重复直到(int!= 0)。我的问题是:当我得到单独的十六进制数字(4位包)时,如何将它们转换为char?例如,我得到:

x & mask = 1101(2) = 13(10) = D(16)

是否有将int转换为十六进制表示的函数,或者我是否必须使用暴力声明或其他任何东西使用暴力?

我差点忘了,我在C中这样做:)

这就是我的意思:

#include <stdio.h>
#include <stdlib.h>

#define BLOCK 4

    int main() {
        unsigned int x, y, i, mask;
        char a[4];

        printf("Enter a positive number: ");
        scanf("%u", &x);
        for (i = sizeof(usnsigned int), mask = ~(~0 << 4); x; i--, x >>= BLOCK) {
            y = x & mask;
            a[i] = FICTIVE_NUM_TO_HEX_DIGIT(y);
        }

        print_array(a);

        return EXIT_SUCCESS;
    }

5 个答案:

答案 0 :(得分:1)

你快到了。将0到15范围内的整数转换为十六进制数字的最简单方法是使用查找表,

char hex_digits[] = "0123456789ABCDEF";

并将其编入索引,

a[i] = hex_digits[y];

代码。

说明:

char a[4];

可能太小了。一个十六进制数字对应于四位,因此对于CHAR_BIT == 8,您最多需要2*sizeof(unsigned) char来表示数字,通常为(CHAR_BIT * sizeof(unsigned int) + 3) / 4。根据{{​​1}}的作用,您可能需要0终止print_array

a

for (i = sizeof(usnsigned int), mask = ~(~0 << 4); x; i--, x >>= BLOCK) 初始化为i会跳过最重要的位,sizeof(unsigned int)应初始化为i的最后一个有效索引(可能是0终结符,然后倒数第二个有效指数)。

掩码可以更简单地定义为a,它具有不调用未定义行为的额外好处,

mask = 0xF

可能会。 mask = ~(~0 << 4) 0,因此int也是~0。在两个补码机器上(现在几乎是所有东西),值为-1,并且向左移动负整数是未定义的行为。

答案 1 :(得分:0)

char buffer[10] = {0};
int h = 17;
sprintf(buffer, "%02X", h);

答案 2 :(得分:0)

我会考虑移位时潜在填充位的影响,因为移位等于或大于整数类型中存在的值位数的任何行为都是未定义的行为。

也许您可以先使用array[--size] = '\0';终止字符串,使用array[--size] = "0123456789ABCDEF"[value & 0x0f]写下最小的半字节(十六进制数字),使用:value >>= 4移动到下一个半字节,然后重复{ {1}}。完成后,返回value > 0array + size,以便调用者知道十六进制序列的开始位置。

答案 3 :(得分:0)

尝试这样的事情:

char hex_digits[] = "0123456789ABCDEF";

for (i = 0; i < ((sizeof(unsigned int) * CHAR_BIT + 3) / 4); i++) {
    digit = (x >> (sizeof(unsigned int) * CHAR_BIT - 4)) & 0x0F;
    x = x << 4;
    a[i] = hex_digits[digit];
}

答案 4 :(得分:0)

好的,这是我得到的地方:

#include <stdio.h>
#include <stdlib.h>

#define BLOCK 4

void printArray(char*, int);

int main() {
    unsigned int x, mask;
    int size = sizeof(unsigned int) * 2, i;
    char a[size], hexDigits[] = "0123456789ABCDEF";

    for (i = 0; i < size; i++)
        a[i] = 0;

    printf("Enter a positive number: ");
    scanf("%u", &x);
    for (i = size - 1, mask = ~(~0 << 4); x; i--, x >>= BLOCK) {
        a[i] = hexDigits[x & mask];
    }

    printArray(a, size);

    return EXIT_SUCCESS;
}

void printArray(char a[], int n) {
    int i;

    for (i = 0; i < n; i++)
        printf("%c", a[i]);

    putchar('\n');
}

我已经编译,它运行并且它正确地完成了工作。我不知道......我应该担心这个问题对我来说有点困难吗?在教师,考试期间,我们必须在一张纸上手工编写我们的代码......我不认为我会做得对。 是否有更好(不太复杂)的方法来解决这个问题?谢谢大家的帮助:))