位操作;将16位值转换为16个布尔值的数组? C语言

时间:2013-07-30 11:57:31

标签: c bit-manipulation bit

我正在阅读一些代码,最后我需要弄清楚这个函数是如何工作的。我理解它的用途以及使用它的原因,但更重要的是它的神奇之处。

根据我的理解,该函数接受一个将所有信息压缩到其中的值。因此,不是只有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;
    }
}

3 个答案:

答案 0 :(得分:0)

该函数检查bitsif(bits & 0x0001))中的LSB。如果设置了该位,则input中的第一个字符设置为'\xa5'(可能是任何字符),否则设置为'\0。然后input被冒充,因此在下一个循环中将设置原始数组的第二个字符并且bits被移位(bits = bits >> 1;),因此下一个循环将检查第二个LSB原始价值。执行16次以解压缩16位。

我们举个例子:

bits = 0x0005(二进制0000 0000 0000 0101)

然后我们

  1. bits & 0x0001是真的==>输入[0] ='\ xa5'

    bits = bits >> 1 ==> bits = 0x0002(二进制... 0010)

  2. bits & 0x0001为false ==>输入[1] ='\ x00'(关于原始输入)

    bits = bits >> 1 ==> bits = 0x0001(binary ... 0001)

  3. bits & 0x0001是真的==>输入[2] ='\ xa5'

    bits = bits >> 1 ==> bits = 0x0000(二进制... 0000)

  4. ..等等

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