2010-04-09 22 views
18

Mam 1 bit w byte (zawsze w najniższej pozycji), które chciałbym odwrócić. tj podane 00000001 Chciałbym dostać 00000000 00000000 i chciałbym 00000001.Odwróć 1 bit w C#

Rozwiązałem to tak:

bit > 0 ? 0 : 1; 

Jestem ciekaw, jak inaczej można to zrobić.

Odpowiedz

39

Jak o:

bit ^= 1; 

To po prostu XOR za pierwszy bit 1, który przełącza go.

Jeśli chcesz odwrócić bitowy #N, licząc od 0 po prawej stronie w kierunku 7 po lewej stronie (na bajt), można użyć tego wyrażenia:

bit ^= (1 << N); 

to nie będzie przeszkadzać każda inna bity, ale jeśli wartość jest tylko kiedykolwiek będzie 0 lub 1 w wartości dziesiętnych (tzn wszystkie pozostałe bity są 0.), wówczas po można stosować także:

bit = 1 - bit; 

Ponownie, jeśli istnieje tylko będzie ustawiony jeden bit, możesz użyć tej samej wartości dla 1, jak w pierwszym, aby odwrócić bit #N:

bit = (1 << N) - bit; 

Oczywiście, w tym momencie nie robisz bitowej manipulacji w tym samym sensie.

Wyrażenie, które masz, jest również w porządku, ale znowu będzie manipulować całą wartością.

Ponadto, jeśli wyraził jeden bit jako wartość bool, można to zrobić:

bit = !bit; 

Które przełącza wartość.


Więcej żart: Oczywiście, "enterprisey" sposób byłoby użyć tabeli odnośników:

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

bit = bitTranslations[bit]; 
+0

Ma to tę zaletę, że nie wymaga pierwszy bit być wybrany jako pierwszy, jak również. –

+0

Najpierw chciałem użyć! ale potem odkrył, że to tylko do booli. Zabawne rzeczy, działające na tym poziomie. –

+0

Dodałbym argument "wyrażając to jako bool" - w zależności od tego, co robisz, może sprawić, że kod będzie trochę łatwiejszy do odczytania dla następnego faceta, który ma go utrzymać. – Paddy

4

Twoje rozwiązanie nie jest poprawne, ponieważ jeśli bit == 2 (10) wtedy twoje zadanie przyniesie bit == 0 (00).

To jest to, co chcesz:

bit ^= 1; 
+0

Masz rację, ale już przesunąłem bit do najniższego rzędu, więc to nie jest dla mnie problem –

+0

Jeśli wszystko, co próbujesz zrobić, to przetestuj/zmanipuluj ten jeden bit, możesz pozbyć się przesunięcia operacja i just xor to na miejscu z inną stałą (np. jeśli był 7. najbardziej znaczącym bitem robisz coś takiego jak bit^= 0x40;) – par