Если вы хотите ОЧИСТИТЬ бит в позиции 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) компилятор все равно превратит его в это во время компиляции (учитывая, что вы используете константы), нет необходимости делать ваш код менее читабельным.