Какой самый эффективный способ стереть отдельные биты в наборе битов? это XOR или И / НЕ? - PullRequest
1 голос
/ 09 февраля 2010

У меня большой набор битов, который я хочу часто сбрасывать в него отдельными битами Какой метод быстрее?

а) bitset[word_index] ^= 1 << bit_index

или

б) bitset[word_index] &= ~(1 << bit_index)

Приложение для рабочего стола (если это играет роль).

Ответы [ 3 ]

5 голосов
/ 09 февраля 2010

Они не делают то же самое.

Опция a будет flip заданный бит; опция b очистит it. Пойдите с тем, что на самом деле отражает ваше намерение. Если вы хотите очистить бит, но вы знаете, что он всегда будет установлен, я бы использовал опцию b, так как она более явно описывает часть «очистить бит».

Когда вы говорите, что хотите делать это "часто" - насколько часто это происходит? Есть ли у вас доказательства того, что это узкое место в вашем заявлении? Если нет, то почему вас интересует самый быстрый способ сделать это, а не самый читаемый способ?

2 голосов
/ 09 февраля 2010

Если вы хотите ОЧИСТИТЬ бит в позиции N, вам нужно установить маску с 0 в позиции N и 1s везде, а затем использовать побитовый оператор И, например:

a &= ~(1 << N);

если вы хотите установить бит в позиции N, вам нужно установить маску с 1 в позиции N и 0 везде, а затем использовать оператор побитового ИЛИ, например:

a |= (1 << N);

Если вы хотите немного переключить в позиции N, вам нужно установить маску с 1 в позиции N и 0 в любом другом месте, а затем использовать побитовый оператор XOR следующим образом:

a ^= (1 << N);

Вы можете применить те же рассуждения, чтобы воздействовать на несколько битов одновременно, обычно путем ИЛИ для одновременного использования отдельных битовых масок. Например, чтобы очистить 3-й, 5-й и 9-й биты в a, вы можете сделать:

a &= ~( (1 << 3) | (1 << 5) | (1 << 9) );

почему вы делаете это так, вместо того, чтобы просто сказать:

a &= 0x0DD7;

две причины -

(1) обычно 3, 5 и 9 будут не литералами, а определенными константами для лучшей читаемости. (2) компилятор все равно превратит его в это во время компиляции (учитывая, что вы используете константы), нет необходимости делать ваш код менее читабельным.

1 голос
/ 09 февраля 2010

Если ваш код правильно выполняет то, для чего он предназначен: это называется микрооптимизацией.

Вряд ли будет существенная разница. Хороший оптимизирующий компилятор даст быстрый код в любом случае.

Предложите вам ориентир в ваших конкретных обстоятельствах. (Также предлагаю написать модульные тесты)

...