Как преобразовать строку в массив?

bort707

★★★★★★✩
21 Сен 2020
3,464
999
А, Вы про чтение бит... я думал про установку. Тогда понял. Извиняюсь за слова про ошибку.

Вообще тут можно придумать массу способов, как это сделать. В зависимости от конфигурации бит иногда удобнее читать маской, иногда читать и сдвигать, или даже просто выбирать биты по одному.
Конкретный вариант выбирается по обстоятельствам.
 

VictorArx

★★★✩✩✩✩
22 Мар 2021
702
107
В целом всё работает. Только чтобы не было пересечения битов знак + нужно менять на побитовое ИЛИ. Чтобы наверняка , не лучше упаковать в 16 битный контейнер и сдвинуть биты.
uint16_t result = (PIND & 0b10101100) | ((uint16_t)(PINB & 0b00011110) << 8); и если result ==0 выполнить код. Что скажете , так годится?
 
Изменено:
  • Лойс +1
Реакции: bort707

VictorArx

★★★✩✩✩✩
22 Мар 2021
702
107
((PIND >> 2)&0x3) | ((PIND >> 3)&0x4) | ((PIND >> 4)&0x8) | ((PINB << 3)&0xF0)
Это мне нужно почитать и понять. &0x3 -это побитовое И с маской 11. Смещаем вправо PIND на 2 бита становится младшие биты 1 и 0. Это 2 и 3 кнопки. PIND смещаем на 3 бита вправо, маска 100 ,это кнопка 5, далее PIND смещаем на 4 бита вправо, маска 1000 , это кнопка 7. Второй регистр PINB смещаем на 3 бита влево и маска 1111 , это кнопки 9, 10, 11, 12. Примерно так, если правильно понял. :)
 
Изменено:

Старик Похабыч

★★★★★★★
14 Авг 2019
4,377
1,341
Москва
По сути да, лучше ИЛИ, НО !
Проверяя 1-ый регистр и используя маску если грубо у нас возможно 2 варианта 0 и не 0, когда где то высокий уровень. Тоже самое со вторым регистром. 0+0 всегда 0, в противном случае не 0 и этого достаточно для проверки условия.
Если надо получать какое то хитрое состояние , когда важно состояние каждого пина, надо ИЛИ
 
  • Лойс +1
Реакции: VictorArx

Мишутк

★✩✩✩✩✩✩
29 Мар 2025
96
41
Зачем побитово сдвигать регистры перед применением маски, если можно сразу применить правильно подготовленную маску и регистры вообще не двигать? В итоге в выражении остается три логические операции (т.к. два регистра).
 

bort707

★★★★★★✩
21 Сен 2020
3,464
999
В итоге в выражении остается три логические операции (т.к. два регистра).
Наложение маски дает только ответ совпадает или нет. Для чтения каждого бита отдельно операций понадобится столько, сколько у нас имеется бит - то есть восемь
 

Мишутк

★✩✩✩✩✩✩
29 Мар 2025
96
41
Наложение маски дает только ответ совпадает или нет. Для чтения каждого бита отдельно операций понадобится столько, сколько у нас имеется бит - то есть восемь
Я комментировал вот это выражение, что оно слишком сложно: ((PIND >> 2)&0x3) | ((PIND >> 3)&0x4) | ((PIND >> 4)&0x8) | ((PINB << 3)&0xF0)
В нем нет опознавания номера бита. И оно очень хорошо упрощается.
 

Мишутк

★✩✩✩✩✩✩
29 Мар 2025
96
41
Давайте нарисуйте, как это упрощается. Будем изучать с вашего позволения. В спорах рождается истина.
(VAR >> 2) & 0x03 для последующего логического анализа тождесвтенен VAR & (0x03 << 2) или VAR & 0x0c
(VAR >> 3) & 0x04 === VAR & 0x20
проверка обоих значений на наличие хоть одного - VAR & 0x2c

UPD: да, я перечитал все снова что тут обсуждали. К этому и пришли. Был невнимателен.
 
Изменено: