Читать биты и положить их в целое число [C] - PullRequest
0 голосов
/ 21 мая 2018

Я действительно новичок в 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

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Есть 3 проблемы с вашим кодом:

  • Вы не инициализируете collect_bits
  • Ваш цикл читает только 31 бит
  • Вы используете битовый кодИ (иначе &) где вы должны использовать побитовое ИЛИ (иначе |)

Таким образом, предполагая, что HAL_GPIO_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
}

Теперь первый бит, считанный с контакта, находится в битовой позиции 0, равной collect_bits, второй бит, считанный с контакта, находится в битовой позиции 1, равной collect_bits и т. Д.

Кстати:Вы должны убедиться, что unsigned int - это 32 бита в вашей системе

0 голосов
/ 21 мая 2018

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    
}
...