Кодирование чисел в двоичном виде. Си

Алгоритм кодирования

Алгоритм кодирования

Суть вопроса как на языке Си реализовать данный алгоритм ? Мои предположения состоят в том что нужно подсчитать сколько байт занимает число, затем отделять от исходного числа по 6 битов( с помощью конъюнкции с числом 0b111111) и соединять их с шаблоном (10xxxxxx) с помощью поразрядных операций, все это делать в цикле и дойдя до первого байта его подставить в уникальный шаблон на основе длины числа.(предполагаю избавляться от уже прочитанных битов с помощью сдвига вправо на 6) Как вычислить длину числа в байтах? Проверять условиями в каком диапазоне лежит число - первое что приходит на ум, но не думаю, что это верное решение. Где хранить промежуточные вычисления ? Хранение результата кодирования предполагается в структуре вот такого вида:

enum {
    MaxCodeLength = 4
};

typedef struct {
    uint8_t code[MaxCodeLength];
    size_t length;
} CodeUnits;

функция кодирования должна выглядеть вот так:

int encode(uint32_t code_point, CodeUnits *code_units)

Параметры:
code_point – число, которое необходимо закодировать code_unit – выходной параметр, результат кодирования Результат: 0, если кодирование успешно, -1 иначе

Мои изыскания пока что вот на этом моменте я попробовал отделить 6 бит, сдвинуть число и повторить тоже самое, в целом успешно, не знаю как задать условие остановки для цикла и как правильно сохранить результат, который получаю побайтово. Функция bin нужна чтобы в консоль вывести число в двоичном виде, нашел на просторах интернета.

#include <assert.h>
#include <stddef.h>
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>

void bin(long long unsigned int k, long unsigned int size)
{
    long unsigned int i;
 
 
    for (i = size * 8; i > 0; --i) {
        printf("%d", (k & ((unsigned long long)1 << (i-1))) ? 1 : 0);
    }
    printf("\n");
}


int main(void){
    uint32_t chislo = 0xa8cc;
    printf("%d\n", sizeof(chislo));
    printf("%d\n", chislo);
    bin(chislo, sizeof(uint32_t));
    uint8_t ch = (chislo & 0b00111111);
    printf("%d\n",(chislo & 0b00111111));
    bin(ch, sizeof(uint8_t));
    ch=0b10000000 | ch;
    bin(ch, sizeof(uint8_t));
    chislo = chislo >> 6;
    ch = (chislo & 0b00111111);
    bin(ch, sizeof(uint8_t));
    ch=0b10000000 | ch;
    bin(ch, sizeof(uint8_t));
}

Ответы (0 шт):