1

我无法弄清楚如何在 c 编程中将 9 char 放入 4 unsigned short 数组中。

我知道一个 char 是 1 个字节,但只使用了 7 位,因为 ascii 表是 0 ~ 127,所以我需要 7 * 9 = 63 位。因为 short 每个是 2 个字节,所以每个 short 有 16 位。4 个短数组是 4 * 16 = 64 位。这意味着我可以将这 9 个字符放入一个由 4 个无符号短字符组成的数组中

所以基本上我有

无符号短 *ptr, theArray[4], 字母 = 0;

整数掩码;

//读取9个字符并将其保存到数组中

我不明白的是如何读取输入的 4 个字符并将其保存到 theArray。限制是我不能先把它们放到一个字符串中,我不能声明除了 int 之外的任何东西。我知道我必须做一些位操作,但我只是不知道如何读取输入。谢谢您的帮助!

4

2 回答 2

0

这就是轮班和/或运营商发挥作用的地方。

我不能给出任何确切的例子,但你可以一起使用它们来将字符“粉碎”成一组无符号短裤。

一个简单的例子,可能不是你正在寻找的,将是:

char j = 'J';
char y = 'Y';
unsigned short s = ( y << 7 ) | j;
于 2013-04-18T20:23:36.893 回答
0

如果我们可以假设 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;
}
于 2013-08-13T08:51:02.023 回答