读取位并将其转换为整数[C]

读取位并将其转换为整数[C],c,bit-manipulation,bit,C,Bit Manipulation,Bit,我是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); //rea

我是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    
    }
unsigned int collect_位;//定义var
for(int i=0;i<31;i++)//32位循环
{
collect_bits&=HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_9);//读取端口C当前位并将其分配给collect_bits
}

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

collect\u位未初始化

试试这个

unsigned int collect_bits = 0;     // define var
for (int i = 0;i < 31; i++)    // loop for 32bits
{
    collect_bits |= HAL_GPIO_ReadPin (GPIOC,GPIO_PIN_9);  //read PORTC status  and assign it to collect_bits    
}
unsigned int collect_bits=0;//定义var
for(int i=0;i<31;i++)//32位循环
{
collect|u bits |=HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_9);//读取端口C状态并将其分配给collect_bits
}

收集位未初始化

试试这个

unsigned int collect_bits = 0;     // define var
for (int i = 0;i < 31; i++)    // loop for 32bits
{
    collect_bits |= HAL_GPIO_ReadPin (GPIOC,GPIO_PIN_9);  //read PORTC status  and assign it to collect_bits    
}
unsigned int collect_bits=0;//定义var
for(int i=0;i<31;i++)//32位循环
{
collect|u bits |=HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_9);//读取端口C状态并将其分配给collect_bits
}

您的代码有3个问题:

  • 您不初始化
    收集\u位
  • 您的循环只读取31位
  • 在应该使用bit-wise或(aka |)的地方使用bit-wise AND(aka&)
因此,假设
HAL\u GPIO\u ReadPin
返回
0
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
}
unsigned int collect_bits=0;
对于(int i=0;i<32;i++)
{
无符号整数当前位=HAL\U GPIO\U ReadPin(GPIOC,GPIO\U引脚9);

收集_位|=当前_位您的代码有3个问题:

  • 您不初始化
    收集\u位
  • 您的循环只读取31位
  • 在应该使用bit-wise或(aka |)的地方使用bit-wise AND(aka&)
因此,假设
HAL\u GPIO\u ReadPin
返回
0
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
}
unsigned int collect_bits=0;
对于(int i=0;i<32;i++)
{
无符号整数当前位=HAL\U GPIO\U ReadPin(GPIOC,GPIO\U引脚9);

collect_bits |=current_bits所以它与collect_bits |=HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_9)相同@kooda我这样写的(使用一个额外的变量)为了更清楚,因为您没有发布
HAL\u GPIO\u ReadPin
的原型。但别担心,编译器会为您优化代码以避免额外的局部变量。谢谢,还有一个问题,为什么您要在循环中重新初始化
unsigned int current\u bit
初始化。我正在从引脚读取下一位。我已在循环内定义了变量以限制范围,即它在循环外不存在。2)是的,使用
uint32\u t
将wise@kooda他没有重新初始化它。所以它与collect_bits |=HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_9)相同。?库达我这样写的(使用一个额外的变量)更清楚地说明问题,因为您没有发布
HAL\u GPIO\u ReadPin
的原型。但别担心,编译器会为您优化代码以避免额外的局部变量。谢谢,还有一个问题,为什么您要在循环中重新初始化
无符号int current\u bit
不确定重新初始化是什么意思。我正在从引脚读取下一位。我已在循环内定义了变量以限制范围,即它在循环外不存在。2)是的,使用
uint32\u t
将是wise@kooda他没有重新初始化。你真的想把同一个pin码读32遍吗?@PeterJ_01嗯,我只是我开始使用C和Keil,我没有发现任何HAL函数可以从端口读取超过1bit的数据,但我想你应该已经理解了这个简单的问题:你想一直读取**相同的位还是不同的位?***@PeterJ_01我想用我的MCU从另一个设备捕获数据,所以我会尝试捕获hig时钟的h脉冲首先在clk引脚上,然后才读取数据引脚(C9),因此它将不是同一引脚。因此,是的,我想读取不同的位扫描,请以更专业的方式解释它?(读取:更精确)顺便说一句,我知道这是STM uC-为什么你想用bitbang而不是使用硬件外设。当你问这个问题时,你到底想存档什么,uC的型号和你想从/TOD读/写数据的设备的型号,你真的想读同一个引脚32次吗?@PeterJ_01嗯,我只是开始与C和Keil合作,还有我没有发现任何HAL函数可以从端口读取超过1比特的数据,但我想你应该理解这个简单的问题:你想一直读取**相同的比特还是不同的比特?***@PeterJ_01我试图用我的MCU从另一个设备捕获数据,所以我会先尝试在clk引脚上捕获时钟的高脉冲然后才读取数据管脚(C9),因此它将不是相同的管脚。所以,是的,我想读取不同的位扫描,请您以更专业的方式解释它?(读取:更精确)顺便说一句,我知道这是STM uC-为什么你想使用bitbang而不是使用硬件外设。当你问这个问题时,请准确写出你想要归档的内容、uC的型号以及你想要从中/向中读取/写入数据的设备的型号