我正在阅读一些代码,最后我需要弄清楚这个函数是如何工作的。我理解它的用途以及使用它的原因,但更重要的是它的神奇之处。
根据我的理解,该函数接受一个将所有信息压缩到其中的值。因此,不是只有16个只保持值0或1的整数,而是将每个0或1的值打包到整数的位中。此函数将这些位取出并将它们分别放入char中。
该函数被调用如此
DecompressInputs(DigOut[0], &input[64]);
使用DigOut,输入是一个定义为此类的数组
UWORD DigOut[2];
char input[NUM_INPUTS]; // NUM_INPUTS = 80
功能本身
/*===============================================*/
/* Name: DecompressInputs */
/* Purpose: Convert a 16 bit value into an array */
/* of 16 boolean values. */
/*===============================================*/
static __inline__ void DecompressInputs(int bits,char *input)
{
char i = 16;
while(i)
{
if(bits & 0x0001)
*input++ = 0x0a5;
else
*input++ = 0x000;
bits = bits >> 1;
i-=1;
}
}
答案 0 :(得分:0)
该函数检查bits
(if(bits & 0x0001)
)中的LSB。如果设置了该位,则input
中的第一个字符设置为'\xa5'
(可能是任何字符),否则设置为'\0
。然后input
被冒充,因此在下一个循环中将设置原始数组的第二个字符并且bits
被移位(bits = bits >> 1;
),因此下一个循环将检查第二个LSB原始价值。执行16次以解压缩16位。
我们举个例子:
bits = 0x0005(二进制0000 0000 0000 0101)
然后我们
bits & 0x0001
是真的==>输入[0] ='\ xa5'
bits = bits >> 1
==> bits = 0x0002(二进制... 0010)
bits & 0x0001
为false ==>输入[1] ='\ x00'(关于原始输入)
bits = bits >> 1
==> bits = 0x0001(binary ... 0001)
bits & 0x0001
是真的==>输入[2] ='\ xa5'
bits = bits >> 1
==> bits = 0x0000(二进制... 0000)
..等等
答案 1 :(得分:0)
好的,让我们试着解释一下这里发生了什么。
首先,我认为static __inline__ void DecompressInputs(int bits,char *input)
应该更新为static __inline__ void DecompressInputs(int bits,char *output)
,因为它看起来更像输出值而不是输入值:但是,这是详细信息。
让我们试着让它更清晰一点:
static __inline__ void DecompressInputs(int bits,char *output)
{
char i = 16;
while(i)
{
/* This will be true if the lowest bit of bits is 1. Otherwise, this is false */
if(bits & 0x0001)
{
/* For whatever reason, you chose 0x0a5 to represent a bit whose value is 1. We write that value to the char pointed by output */
*output = 0x0a5;
/* Now that the value has been written, increment output so the next write will go the next char */
output++;
}
else
{
/* Same here, but we store 0x00 instead */
*output = 0x000;
output++;
}
// Now we bitshift bits, so the next time we do bits & 0x0001, we will check for the second bit of the original integer
bits = bits >> 1;
i-=1;
}
}
答案 2 :(得分:0)
此版本的代码可能更容易理解,因为它并不依赖于修改值:
static __inline__ void DecompressInputs(int bits, char *output)
{
for (int bit = 0; bit < 16; ++bit)
{
int mask = 1 << bit;
if (bits & mask)
output[bit] = 0x0a5;
else
output[bit] = 0;
}
}