Мне нужно знать, как выполнить очень специфическую побитовую функцию очень быстро - PullRequest
0 голосов
/ 14 декабря 2011

Я выполняю побитовую функцию для 32- и 64-разрядных целых чисел и застрял при написании метода (setValueAt(index, newState)), который устанавливает бит по индексу index в 1, если newState равно true или 0, если newState равно false. Какую побитовую функцию я могу использовать для выполнения следующих операций с той же скоростью, что и AND, OR, XOR и т. Д .? Я не решаюсь использовать метод обнаружения, а затем XOR, если бит имеет быть измененным, так как это может занять слишком много времени; этот метод должен вызываться быстро, возможно, сотни раз подряд в зависимости от действий пользователя.

===setValueAt(3, false)===

    0101 0001
  ? 0000 1000
==============
    0101 0001



    0101 1001
  ? 0000 1000
==============
    0101 0001

Если это поможет, ниже приведена таблица истинности желаемого эффекта:

 |0|1
-+-+-
0|0|0
-+-+- 
1|1|0

1 Ответ

3 голосов
/ 14 декабря 2011
void setValueAt(int &value, int pos, bool newState) {
    value = newState ? (1 << pos) | value : ~(1 << pos) & value;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...