#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;