Russian Qt Forum
Ноябрь 23, 2024, 08:22 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Количество единиц в байте  (Прочитано 8381 раз)
OKTA
Гость
« : Май 26, 2014, 12:57 »

Товарищи, есть задача посчитать количество 1-ц в последовательности. В итоге все сводится к подсчету единиц в каждом отдельном байте. Так вот вопрос, как будет быстрее? Побитовым сдвигом или логическим И, используя шабоны байт с единицей в разных местах?
Записан
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #1 : Май 26, 2014, 13:13 »

Я думаю, самый быстрый способ - это табличный. Когда позиция в массиве будет хранить количество единиц в байте, соответствующем позиции.
Записан
OKTA
Гость
« Ответ #2 : Май 26, 2014, 14:14 »

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

Не очень понял))
Записан
Bepec
Гость
« Ответ #3 : Май 26, 2014, 14:21 »

Я думаю битовым будет быстрее. Хотя тут уже в реализацию надо смотреть.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #4 : Май 26, 2014, 14:24 »

Думаю, быстрее табличного не найти.
Записан
OKTA
Гость
« Ответ #5 : Май 26, 2014, 15:53 »

Спасибо за ответы! Попробую так и так для эксперимента Подмигивающий
Записан
Vamireh
Гость
« Ответ #6 : Май 26, 2014, 17:23 »

int a[255] = {n0, n2, n3.... n254}, где nX - количество единиц в числе X.

for (byte : all)
sum += a[byte]

быстрее вряд ли что-то будет
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #7 : Май 26, 2014, 17:44 »

int a[255] = {n0, n2, n3.... n254}, где nX - количество единиц в числе X.
Таблица должна быть длиной 256 байт: от 0 до 255.
Записан
OKTA
Гость
« Ответ #8 : Май 26, 2014, 17:49 »

Да, этот метод гораздо быстрее работает! На 50 КБ данных как минимум в 4 раза быстрее!
Спасибо!
Записан
kamre
Частый гость
***
Offline Offline

Сообщений: 233


Просмотр профиля
« Ответ #9 : Май 26, 2014, 18:06 »

http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetNaive
Записан
Vamireh
Гость
« Ответ #10 : Май 26, 2014, 18:15 »

int a[255] = {n0, n2, n3.... n254}, где nX - количество единиц в числе X.
Таблица должна быть длиной 256 байт: от 0 до 255.

Да-да. Давайте не будем к цифрам придираться? Все всё поняли.
Записан
Vamireh
Гость
« Ответ #11 : Май 26, 2014, 18:19 »

Хотя может будет быстрее, если по два байта, например проверять:
Код:
*reinterpret_cast<short*>(&buffer[i])
Интерпретация указателей на этапе компиляции устанавливается, а итераций будет меньше. Естественно еще четное/нечетное
количество байт нужно учесть.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #12 : Май 26, 2014, 20:56 »

Да-да. Давайте не будем к цифрам придираться? Все всё поняли.
Ну вообще то, все всё поняли после первого же ответа в теме. Улыбающийся
А если вы решили "разжевать" с примерами, то это не плохо делать без ошибок. Подмигивающий
« Последнее редактирование: Май 26, 2014, 20:58 от Old » Записан
OKTA
Гость
« Ответ #13 : Май 26, 2014, 21:03 »

Дальнейшее ускорение уже не столь важно в моей задачке, но с шортами попробую ради интереса.  Подмигивающий
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Май 27, 2014, 06:25 »

Хороший пример premature optimisation - оптимизации того что узким местом не будет. Ну так, из любви к искусству  Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.095 секунд. Запросов: 23.