Инвертировать 1 бит в C # - PullRequest
18 голосов
/ 09 апреля 2010

У меня есть 1 бит в byte (всегда в самой младшей позиции), который я хотел бы инвертировать. т.е. с заданным 00000001 я бы хотел получить 00000000, а с 00000000 я бы хотел 00000001.

Я решил это так:

bit > 0 ? 0 : 1;

Мне любопытно посмотреть, как еще это можно сделать.

Ответы [ 2 ]

41 голосов
/ 09 апреля 2010

Как насчет:

bit ^= 1;

Это просто XOR - первый бит с 1, который переключает его.

Если вы хотите перевернуть бит #N, считая от 0 справа до 7 слева (для байта), вы можете использовать это выражение:

bit ^= (1 << N);

Это не будет мешать другим битам, но если значение будет когда-либо только 0 или 1 в десятичном значении (т. Е. Все остальные биты равны 0), то также может использоваться следующее:

bit = 1 - bit;

Опять же, если будет установлен только один бит, вы можете использовать то же значение для 1, что и в первом, чтобы перевернуть бит #N:

bit = (1 << N) - bit;

Конечно, в этот момент вы на самом деле не выполняете битовую манипуляцию в том же смысле.

Выражение, которое у вас есть, тоже хорошо, но опять-таки будет манипулировать всем значением.

Кроме того, если вы выразили один бит как значение bool, вы можете сделать это:

bit = !bit;

Который переключает значение.


Еще шутка : Конечно, «корпоративный» способ будет использовать таблицу поиска:

byte[] bitTranslations = new byte[256];
bitTranslations[0] = 1;
bitTranslations[1] = 0;

bit = bitTranslations[bit];
4 голосов
/ 09 апреля 2010

Ваше решение неверно, потому что если бит == 2 (10), то ваше назначение даст бит == 0 (00).

Это то, что вы хотите:

bit ^= 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...