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
数组包含格式正确且有效的数据,但那更进一步下线...
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
数组包含格式正确且有效的数据,但那更进一步下线...