Поместите 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;
}