Извлечение определенных битов из целого числа и сохранение их в строку в C? - PullRequest
0 голосов
/ 26 августа 2018

У меня проблемы с извлечением определенных битов из 32-битного целого числа и сохранением этих битов в строку.

Чтобы лучше объяснить мою проблему, я объясню это так:

Хорошо, допустим, у меня есть целое число:

01010101010101010101000011010100

Я хочу извлечь (переход от MSB к LSB) со 2-го (включенного) до 21-го бита (включенного).

Так что я могу простосоздайте маску, которая будет содержать только те 20 бит, которые я хочу, и обнулять все остальные.

Integer: 01010101010101010101000011010100
Mask:    01111111111111111111100000000000

New integer = Integer & Mask = 01010101010101010101000000000000

После этого я понятия не имею, как сохранить эти 20 битов в строку.

Хорошо, теперь допустим, у нас есть массив символов, которыйможет содержать 100 символов.

Затем мне нужно скопировать эти 20 битов из целого числа в массив символов, чтобы только эти 20 бит отображались в виде текста.Вот как это должно быть:

printf("Text: %s", string); -> "Text: 10101010101010101010"

Надеюсь, я объяснил это достаточно хорошо.Если у вас остались вопросы, дайте мне знать.

1 Ответ

0 голосов
/ 26 августа 2018
unsigned long long extractbits(unsigned long long data, unsigned start, unsigned end)
{
    unsigned long long mask;
    if(start > end)
    {
        unsigned tmp = start;
        end = start;
        start = tmp;
    }
    mask = (end == sizeof(unsigned long long) * 8 - 1) ? ~0ULL : (1ULL << (end + 1))) - 1;
    return ((data & mask) >> start);
}

char *to_string(char *buff, unsigned long long data)
{
    char *cptr = buff;
    char *sptr = buff;
    while(data)
    {
        *cptr++ = (data & 1) ? '1' : '0';
        data >>= 1;
    }
    *cptr-- = 0;
    while(cptr > buff)
    {
        char tmp = *cptr;
        *cptr-- = *buff;
        *buff++ = tmp;
    }
    return sptr;
}

int main()
{
    char buff[25];
    printf("%s\n", to_string(buff, extractbits(0b11100011100011100011ULL, 4, 17)));

    return 0;
}
...