首页 > 解决方案 > 读取位并将它们放入整数 [C]

问题描述

我真的是 C 的新手,我在位操作方面遇到了麻烦,我阅读了很多关于它的信息,似乎它是 C 的困难部分之一,有人可以解释我如何收集 32 位然后将它们分配给无符号整数。

    unsigned int collect_bits;     // define var
    for (int i = 0;i < 31; i++)    // loop for 32bits
    {
    collect_bits &= HAL_GPIO_ReadPin (GPIOC,GPIO_PIN_9);  //read PORTC current bit and assign it to collect_bits    
    }

我知道上面的代码是错误的,但我不知道如何将位从 PORT 分配给 var

标签: cbit-manipulationbit

解决方案


您的代码存在 3 个问题:

  • 你没有初始化collect_bits
  • 您的循环仅读取 31 位
  • 您使用按位 AND(又名 &),而您应该使用按位 OR(又名 |)

因此,假设HAL_GPIO_ReadPin返回0or 1,您可以执行以下操作:

unsigned int collect_bits = 0;
for (int i = 0; i < 32; i++)
{
    unsigned int current_bit = HAL_GPIO_ReadPin (GPIOC,GPIO_PIN_9);
    collect_bits |=  current_bit << i;  // Shift current_bit to position i and
                                        // put it into collect_bits using bit wise OR
}

现在从引脚读取的第一个位在 0 的位位置collect_bits,从引脚读取的第二个位在 1 的位位置collect_bits,依此类推。

顺便说一句:您必须确保unsigned int系统上是 32 位


推荐阅读