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;
}
}
答案 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相关的问题,并获得了这些位的值。