Russian Qt Forum

Программирование => С/C++ => Тема начата: OKTA от Май 26, 2014, 12:57



Название: Количество единиц в байте
Отправлено: OKTA от Май 26, 2014, 12:57
Товарищи, есть задача посчитать количество 1-ц в последовательности. В итоге все сводится к подсчету единиц в каждом отдельном байте. Так вот вопрос, как будет быстрее? Побитовым сдвигом или логическим И, используя шабоны байт с единицей в разных местах?


Название: Re: Количество единиц в байте
Отправлено: alex312 от Май 26, 2014, 13:13
Я думаю, самый быстрый способ - это табличный. Когда позиция в массиве будет хранить количество единиц в байте, соответствующем позиции.


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

Не очень понял))


Название: Re: Количество единиц в байте
Отправлено: Bepec от Май 26, 2014, 14:21
Я думаю битовым будет быстрее. Хотя тут уже в реализацию надо смотреть.


Название: Re: Количество единиц в байте
Отправлено: Old от Май 26, 2014, 14:24
Думаю, быстрее табличного не найти.


Название: Re: Количество единиц в байте
Отправлено: OKTA от Май 26, 2014, 15:53
Спасибо за ответы! Попробую так и так для эксперимента ;)


Название: Re: Количество единиц в байте
Отправлено: Vamireh от Май 26, 2014, 17:23
int a[255] = {n0, n2, n3.... n254}, где nX - количество единиц в числе X.

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

быстрее вряд ли что-то будет


Название: Re: Количество единиц в байте
Отправлено: Old от Май 26, 2014, 17:44
int a[255] = {n0, n2, n3.... n254}, где nX - количество единиц в числе X.
Таблица должна быть длиной 256 байт: от 0 до 255.


Название: Re: Количество единиц в байте
Отправлено: OKTA от Май 26, 2014, 17:49
Да, этот метод гораздо быстрее работает! На 50 КБ данных как минимум в 4 раза быстрее!
Спасибо!


Название: Re: Количество единиц в байте
Отправлено: kamre от Май 26, 2014, 18:06
http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetNaive


Название: Re: Количество единиц в байте
Отправлено: Vamireh от Май 26, 2014, 18:15
int a[255] = {n0, n2, n3.... n254}, где nX - количество единиц в числе X.
Таблица должна быть длиной 256 байт: от 0 до 255.

Да-да. Давайте не будем к цифрам придираться? Все всё поняли.


Название: Re: Количество единиц в байте
Отправлено: Vamireh от Май 26, 2014, 18:19
Хотя может будет быстрее, если по два байта, например проверять:
Код:
*reinterpret_cast<short*>(&buffer[i])
Интерпретация указателей на этапе компиляции устанавливается, а итераций будет меньше. Естественно еще четное/нечетное
количество байт нужно учесть.


Название: Re: Количество единиц в байте
Отправлено: Old от Май 26, 2014, 20:56
Да-да. Давайте не будем к цифрам придираться? Все всё поняли.
Ну вообще то, все всё поняли после первого же ответа в теме. :)
А если вы решили "разжевать" с примерами, то это не плохо делать без ошибок. ;)


Название: Re: Количество единиц в байте
Отправлено: OKTA от Май 26, 2014, 21:03
Дальнейшее ускорение уже не столь важно в моей задачке, но с шортами попробую ради интереса.  ;)


Название: Re: Количество единиц в байте
Отправлено: Igors от Май 27, 2014, 06:25
Хороший пример premature optimisation - оптимизации того что узким местом не будет. Ну так, из любви к искусству  :)