Использование набора битов вместо использования рукописного кода манипуляции битами? - PullRequest
0 голосов
/ 13 июля 2010

Есть ли какая-либо потеря / увеличение производительности при использовании набора битов в месте, где написано от руки?

Как создать следующее с использованием набора битов во время выполнения

  • сделать все биты между 2 и 5 равными нулю, т.е. 11110011.

Ответы [ 3 ]

6 голосов
/ 13 июля 2010

Золотое правило:

Не оптимизируйте преждевременно!

Битовый набор будет в 99% случаев, будет быстрым достаточно , иПреимущество состоит в том, что он является общим понятием, так что он более читабелен и менее подвержен ошибкам реализации.Не просто предполагайте, что вашему коду, очевидно, потребуется увеличение скорости;написать код, используя bitset, профилировать ваше приложение и посмотреть, если:

  1. Это достаточно быстро, как есть;и
  2. Если он недостаточно быстр, действительно ли он тратит большую часть своего времени на выполнение битовых операций?

В соответствии с правилом 80-20, есть вероятность, что вы получитегораздо большая отдача от более быстрого выполнения некоторого кода.И, эй, если окажется, что вам нужно улучшить скорость бит-твидлинга, по крайней мере, у вас есть несколько приличных базовых цифр, которые можно использовать, чтобы показать, что ваше решение действительно быстрее, чем по умолчанию (что вам все равно понадобитсяесли вы хотите оптимизировать производительность).

1 голос
/ 13 июля 2010

Самым простым решением вашего второго вопроса было бы использование другого набора битов.

void makebitszero(bitset<8>& b) {
  // Everything but bits 3 and 4 (between 2 and 5).
  static const bitset<8> mask = ~bitset<8>(12);
  b &= mask;
}

Требуется немного математики, чтобы придумать выражение для mask при двухбитовых позициях.

[править] Хорошо, вот математика.Хитрость в том, что (1UL << X) -1 - это последовательность из X единиц.Например, 3 => 00000111. Следовательно, (1 << 5) - (1 << 3) = 00011111 - 00000111 -1 + 1 = 00011000 (биты 3 и 4).Таким образом, в коде: </p>

template<int i, int j, int N> 
void makeBitsZero(bitset<N>& b) {
  // Everything from bit i up to but not including bit j (i < j)
  static const bitset<N> mask = ~bitset<N>(1UL<<j) - (1UL<<i));
  b &= mask;
}
0 голосов
/ 13 июля 2010

Для простого примера, такого как приведенный выше, приличное решение с ручным кодированием будет быстрее, чем использование набора битов, но различия в производительности в любом случае будут небольшими.

...