读取位并将其转换为整数[C]
我是C语言的新手,我对位运算有困难,我读了很多关于它的信息,似乎它是C语言的一个困难部分,有人能告诉我如何收集32位,然后分配给无符号整数吗读取位并将其转换为整数[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
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
}
我知道上面的代码是错误的,但我不知道如何将端口中的位分配给varcollect\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的型号以及你想要从中/向中读取/写入数据的设备的型号