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

用户名

我正在阅读一些代码,最后我需要弄清楚该函数的工作原理。我了解它的用途以及为什么使用它,但除此之外,它还具有魔力。

据我了解,该函数采用了一个将所有信息压缩到其中的值。因此,不是将16个仅包含值0或1的整数打包,而是将每个0或1值打包到该整数的位中。然后此函数将这些位取出,然后将它们每个都放入一个char中。

该函数的调用方式如下

DecompressInputs(DigOut[0], &input[64]);

在DigOut和input是这样定义的数组的情况下

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

好的,让我们尝试解释这里发生的事情。

首先,我认为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;
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在C语言中,如何将几个布尔值转换为int,其位值是差值测试的结果

来自分类Dev

将4位整数转换为布尔值列表

来自分类Dev

将位掩码转换回9个布尔值

来自分类Dev

将位掩码转换回9个布尔值

来自分类Dev

如何将 32 位浮点值转换为两个 16 位整数

来自分类Dev

将16位值转换为8位值的有效方法

来自分类Dev

将PLC Modbus信号转换为浮点值(将16位整数对转换为32位浮点)

来自分类Dev

将数组内的布尔值转换为if语句

来自分类Dev

将python列表转换为numpy数组布尔值

来自分类Dev

将16位无符号整数数组转换为32位浮点数组

来自分类Dev

将Typescript转换为布尔值

来自分类Dev

将布尔值转换为整数

来自分类Dev

将布尔值转换为char

来自分类Dev

如何在C ++中将16位十六进制颜色转换为RGB888值

来自分类Dev

c#将char转换为布尔值列表

来自分类Dev

C# 将布尔值转换为字节[4]

来自分类Dev

将32位数字转换为16位或更少

来自分类Dev

将16位无符号整数数组转换为位的快速方法

来自分类Dev

将数组的布尔值推入uint8位域

来自分类Dev

如何计算两个包含8位值的数组的16位点积?

来自分类Dev

为什么有人会在C语言中按位与8位值和16位掩码进行比较?

来自分类Dev

将8位值转换为24位值

来自分类Dev

C ++中带有布尔值的^(按位XOR)

来自分类Dev

将xs:boolean值转换为Java布尔值

来自分类Dev

通过将布尔值转换为数组来减小JSON大小是一个好主意吗?

来自分类Dev

布尔值的按位运算

来自分类Dev

位向量与布尔值性能列表

来自分类Dev

按位与如何与布尔值交互?

来自分类Dev

将位位置转换为掩码值