Кодирование чисел в двоичном виде. Си
Суть вопроса как на языке Си реализовать данный алгоритм ? Мои предположения состоят в том что нужно подсчитать сколько байт занимает число, затем отделять от исходного числа по 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));
}
