将7个char放入2个unsigned short的数组中

时间:2013-04-18 20:12:39

标签: c bit-manipulation

我无法弄清楚如何将9个字符串放入c编程中的4个无符号短数组中。

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

的数组

基本上我有

  

unsigned short * ptr,theArray [4],letter = 0;

     

int mask;

     

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

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

2 个答案:

答案 0 :(得分:0)

这是班次和/或操作员发挥作用的地方。

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

一个简单的例子,可能不完全是你想要的,将是:

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

答案 1 :(得分:0)

如果我们可以假设无符号短= 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;
}