如何从C语言的整数数组中读取2位?

时间:2015-09-08 05:28:14

标签: c bits

U32 BitMap[6] /* 6 words for 96 persons*/

如何使程序循环读取上面位图中的6个单词,我们必须每人读取2位并存储人员ID并将结果存入tPersonMsg

/* 2 Bits representing  00-> default value, 01->Command Successful, 10->Command Failed
   * | 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
   * |<Pr15>|--------------------------------------------------------------------------------------------------------------------------------------|<Pr2>|<Pr1>|<Pr0>|
   * | 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0 |
   * |<P31>|--------------------------------------------------------------------------------------------------------------------------------------|<P18>|<P17>|<P16>|
--- similarly for 96 persons*/

获取以下结构中命令失败的人员的结果。

typedef enum eFinalResult {
    Succ= 0,
    Fail = 1,
    noResponse = 2,
} eFinalResult ;

typedef struct {
   U32                        Person_Id;
   tFinalResult         Person_Result;
} tResult;


typedef struct {
   U32             NumPersons;
   tResult         Result[32];
} tPersonMsg;

我不是在这里惹恼任何人,我是C编程的初学者 直到现在我正在努力制作如下程序:

for (i=0; i<6; i++)  /* Loop for 6 words*/  
{  
   k = 0;  
   t= 0x3;  
   for (j=0; j<31; j+2) /* Loop for bits to reach even position like 0th bit,2nd bit,4th ...and so on*/  
   {  
      bits = (a[i] & t) >>j;  
      k++;  
      if (a[i] == 2)  
      {  
         Command Failed  
         Person Id = j/2;  
      }  
    t = t<<2;  
    }  
}  

3 个答案:

答案 0 :(得分:1)

对于一位,对于char == 8位的情况。

int get1bit(unsigned char *array, int bitpos)
{
int res = array[bitpos >> 3];
res >>= (bitpos & 0x07);
return(res & 0x01);
}

答案 1 :(得分:1)

您已经观察到需要6个32位字来保存96个人的数据:96个人x 2个/人= 192位数据,192/32 = 6个字来保存它们。

您还可以看到一个字每个结果包含32/2位= 16个结果。

所以,为了找到正确的单词,你将人的ID除以16,其余的是&#39;索引&#39;他们在单词中的结果位。使用索引乘以2(每个结果中的位数)来移位包含结果的字,使正确的结果位处于最低位,并屏蔽剩余的位以获得结果。

static const U32 BITS_PER_RESULT = 2;
static const U32 RESULTS_PER_WORD = 32 / BITS_PER_RESULT;
static const U32 RESULT_MASK = 0x3;

// The following line is commented out because, although implemented in
// several compilers, it is not part of the C standard (at the moment).
/*static const U32 RESULT_MASK = 0b11;*/

tResult FindResultForPerson(U32 personId)
{
    // Find the word in the results array that contains the relevant bits.
    U32 resultBits = BitMap[personId / RESULTS_PER_WORD];

    // Shift the result word right so that the required bits are in the
    // least significant bit position.
    resultBits >>= ((personId % RESULTS_PER_WORD) * BITS_PER_RESULT);

    // Mask out any more significant bits to leave only the required result.
    return resultBits & RESULT_MASK;
}

在某些时候,您需要确保传递给personId中的函数的值不在范围之外,并且BitMap数组包含格式正确且有效的数据,但是&#39;更进一步......

答案 2 :(得分:-1)

如果真正的问题是在任何位置获得两位的值。 答案是准备面具。 n&amp;(n-1)总是检查最后一位的值(也取决于处理器的Arch)。 或者简单的步骤是使用最大32位或64位的掩码(再次取决于ARCH)。 Stackoverflow有很多与Masking相关的问题,并获得了这些位的值。