Свежие обсуждения
Микроконтроллеры

Быстро проверить сколько единиц в байте.

1 2

Одна или больше. На ум приходит только 8 сдвигов или сравнение с 8-ю шаблонами.

 

насколько быстро? Готов за скорость заплатить 256 байт памяти?

 

можно таблицу на 16 значений. но тогда полубайты swap`ать надо, и складывать результат.

 

rfc: можно таблицу на 16 значений.
А зачем 16? 4х не хватит? Если больше одной "1" , то меня этот байт уже не интересует.

 

Полубайт - 16 вариантов. таблица должна содержать все, чтобы не "вылететь" за пределы массива. Из этих 16 вас будут интересовать только 4 - это да. причем, есил вы в полубайте имеете "0", то второй полубайт проверяете на "1" бит, если в полубате "1" единица, второй проверяете на ноль, если в первом полубайте больше одной единицы - второй не проверяете. но таблица по люболму 16 или 15 значений (если на нулевом съэкономить)

 

Да-а, геморно. Я думал, какой-нибудь фокус-покус есть.

 

Сваяйте специательный процессор С коммандой "Подсчет единиц в байте" дарю мнемонику bbmto

 

Вывести единицы последовательно в порт, там посчитать внешним счетчиком и впихнуть обратно значение -- 1 или 0. Если пожертвовать второй линией порта -- можно досрочно прерваться, если уже есть вторая единица. Если не жалко целых 9 линий -- то получается супербыстрый вариант, работающий за две команды.

 

На пике можно уложиться в команд 17команд с 2я ячейками RAM, CNT_bit счетчик к-ва едениц, Test_byte проверяемое значение.
1) clrf CNT_bit
2) btfsc Test_byte,0
3) incf CNT_bit,f
4) btfsc Test_byte,1
5) incf CNT_bit,f
6) btfsc Test_byte,2
7) incf CNT_bit,f
8) btfsc Test_byte,3
9) incf CNT_bit,f
10) btfsc Test_byte,4
11) incf CNT_bit,f
12) btfsc Test_byte,5
13) incf CNT_bit,f
14) btfsc Test_byte,6
15) ncf CNT_bit,f
16) btfsc Test_byte,7
17) incf CNT_bit,f
Можно реализовать цикл со сдвигом через "С" и модификацией счетчика сэкономим память программ, но потеряем ячейку RAM и выполняться будет дольше

 

Можно к 0xXX байту прибавить 0xFF и смотреть на флаг переполнения (переноса). Если флаг переполнения 0 значит в XX все нули.