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

How to read 2 bits from an array of integers in C language?

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;  
    }  
}  

if 真正的问题是获取任意位置的两个位的值。 答案是准备面具。 n&(n-1) 将始终检查最后一位的值(也取决于处理器的 Arch)。 或者简单的步骤是使用最大 32 位或 64 位的掩码(同样取决于 ARCH)。 Whosebug有很多关于Masking和获取位值的问题。

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

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

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

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

因此,要找到正确的单词,您需要将此人的 ID 除以 16,余数是单词中其结果位的 'index'。使用索引乘以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 数组包含格式正确且有效的数据,但那更进一步下线...