Поместите 7 символов в массив из 2 неподписанных коротких

У меня проблемы с выяснением того, как поместить 9 символов в массив из 4 беззнаковых шорт в программировании на c.

Я знаю, что символ равен 1 байту, но используются только 7 бит, потому что в таблице ascii 0 ~ 127, поэтому мне нужно 7 * 9 = 63 бита. так как short составляет 2 байта каждый, то он имеет 16 бит для каждого short. массив из 4 коротких 4 * 16 = 64 бит. Это означает, что я могу поместить эти 9 символов в массив из 4 неподписанных коротких

так что в основном у меня есть

беззнаковый короткий *ptr, theArray[4], letter = 0;

маска int;

// читаем 9 символов и сохраняем их в массив

Чего я не понимаю, так это как прочитать введенные 4 символа и сохранить их в массиве. Ограничение состоит в том, что я не могу сначала поместить их в строку, я не могу объявить ничего, кроме int. Я знаю, что должен выполнить некоторые манипуляции с битами, но я просто не знаю, как читать ввод. Спасибо за помощь!

2 ответа

Это где сдвиг и / или операторы вступают в игру.

Я не могу привести точных примеров, но вы можете использовать их вместе, чтобы "разбить" символы в массив беззнаковых шорт.

Быстрый пример, возможно, не совсем то, что вы ищете, будет:

char j = 'J';
char y = 'Y';
unsigned short s = ( y << 7 ) | j;

Если мы можем предположить, что unsigned short = 16 битов и char = 8, тогда, если я не сделал опечатку, что об этом:

#include <stdio.h>

int main()
{
  unsigned short *ptr, theArray[4], letter = 0;
  int mask;

  // theArray:
  //  |<-------0------>|<-------1------>|<-------2------>|<-------3------>|
  // characters:
  //   0111111122222223 3333334444444555 5555666666677777 7788888889999999

  // Because we use |= first clear the whole thing
  theArray[0] = theArray[1] = theArray[2] = theArray[3] = 0;

  /* char 1 */  letter=getchar();
                theArray[0] |= 0x7F00 & (letter << 8);

  /* char 2 */  letter=getchar();
                theArray[0] |= 0x00FE & (letter << 1);

  /* char 3 */  letter=getchar();
                theArray[0] |= 0x0001 & (letter >> 6);
                theArray[1] |= 0xFC00 & (letter << 10);

  /* char 4 */  letter=getchar();
                theArray[1] |= 0x03F8 & (letter << 3);

  /* char 5 */  letter=getchar();
                theArray[1] |= 0x0007 & (letter >> 4);
                theArray[2] |= 0xF000 & (letter << 12);

  /* char 6 */  letter=getchar();
                theArray[2] |= 0x0FE0 & (letter << 5);

  /* char 7 */  letter=getchar();
                theArray[2] |= 0x001F & (letter >> 2);
                theArray[3] |= 0xC000 & (letter << 14);

  /* char 8 */  letter=getchar();
                theArray[3] |= 0x3F80 & (letter << 7);

  /* char 9 */  letter=getchar();
                theArray[3] |= 0x007F & letter;

  return 0;
}
Другие вопросы по тегам