Сжатие строки с использованием битового поля

#c #data-structures #bit-manipulation #structure #bit-packing

#c #структуры данных #манипулирование битами #структура #упаковка битов

Вопрос:

Я должен закодировать массив строк таким образом, чтобы: 1. Закодированный вывод представлял собой одну строку с минимально возможной длиной 2. Вы должны быть в состоянии декодировать строку позже. Строка состоит только из символов нижнего регистра. Я не очень хорошо разбираюсь в использовании битовых полей. . Я просто сдвигаю вправо на 3, когда присваиваю букву enc_string . Или я могу использовать созданную мной структуру? Также, как я могу убедиться, что я действительно сэкономил место. Я не могу использовать sizeof, поскольку он возвращает в байтах?

Как мне выполнить упаковку битов.

 #include <stdio.h>

typedef struct{
    
    int val:5;
    
}input;

char* encode_string(char **str_arr,int len, int *ret_len){
     
    int i = 0;
    int j = 0;
    int k = 0;
    char *enc_string = (char*)malloc(10*len*sizeof(char));
    for(i=0;i<len;i  ){
        for(j=0;j<strlen(str_arr[i]); j  ){
            enc_string[k] = str_arr[i][j]; // str_arr[i][j]>>3
            k  ;
        }
        enc_string[k  ] = '*';
        
    }
    if(k>0){
      enc_string[k]='';
      *ret_len = k;
    }
    return enc_string;
    
    
}


int main()
{
    char* str[] = {"abcd","fghi","jkl"};
    char *enc_string;
    int enc_len = 0;
    enc_string = encode_string(str,3,amp;enc_len);
    printf("Encoded string %s size %d n",enc_string,enc_len);

    return 0;
}
  

Комментарии:

1. Структуры с битовыми полями все равно будут дополнены. Самый простой способ сжать строковые данные до 5 бит — это просто выполнить побитовые операции с массивом символов без знака.

2. Примечание: выполнение for(j=0;j<strlen(str_arr[i]); j ) ... выполняется очень медленно. Вместо цикла, занимающего O (n), требуется O (n ^ 2) времени. Заменить на: int jlen = strlen(str_arr[i]); for (j=0; j < jlen; j) ...

3. Или, что еще лучше, замените весь цикл на: for (const char *js = str_arr[i]; *js != 0; js, k) enc_string[k] = *js;