2011-06-28 10 views
12

[sposób korzystania z ~ operatora]jak korzystać z odwrotnego C

Mam strukturę powiedzieć Alpha. Znam wartość elementu wewnątrz Alpha (powiedzmy a), który może być 0 lub 1 - Chcę, aby inny element tej samej struktury przyjmował odwrotną wartość Alpha.a. Na przykład:

if Alpha.a = 1 
then Alpha.b = 0 

i vice versa

Próbowałem:

Alpha.b = ~ (Alpha.a) 

Ale niestety nie robi praca - kiedy Alpha.a jest 1, Alpha.b zostanie ustawiony na 254

jakieś pomysły ?

Dzięki i pozdrawiam,

SamPrat

+6

** Dlaczego to nie działa? Co się dzieje? ** – SLaks

+0

pokazuje wartość 254 – samprat

+2

Cześć chłopaki, jestem ciekawa, dlaczego moje pytanie zostało odrzucone, aby od następnego razu naprawić mój błąd? – samprat

Odpowiedz

22

Zastosowanie XOR operator:

Alpha.b = Alpha.a^1; 
+0

to działa bezbłędnie – samprat

+0

Bardzo dziękuję za szybką pomoc – samprat

0

Chcesz użyć innego operatora. Konkretnie !

Alpha.b = !Alpha.a 

Ponieważ wartości wynoszą zero lub jeden, jest znacznie prostszy.

+0

próbowałem również. to nie działa – samprat

+8

** Dlaczego nie? Co się dzieje? ** – SLaks

3

Operator ~ neguje każdy pojedynczy bit. Załóżmy na przykład, że Alpha.a to unsigned char. Wtedy ~1 odczytałby, binarnie, ~ 00000001, a wynik byłby 11111110 (znowu w binarnym), który jest taki sam jak 254 w systemie dziesiętnym i 0xFE w hex.

Jak sugerowali inni, należy użyć !Alpha.a lub Alpha.a^1.

29

W języku C, true jest reprezentowany przez 1, a false przez 0. Jednak w porównaniu, dowolna wartość inna niż false jest traktowana jest prawdziwa.

Operator ! robi logiczna inwersji, tak! 0 oznacza 1! 1 0.

Operator ~ jednak robi bitowe inwersji, gdzie każdy bit w wartości zastępuje się jego odwrotność. Więc ~ 0 to 0xffffffff (-1). ~ 1 to 0xfffffffe (-2). (Obie wartości -1 i -2 są uznawane za prawdziwe, co prawdopodobnie powoduje zamieszanie.)

To, czego chcesz, to !, zamiast ~.

0

Nie można użyć ~, ponieważ zmieni to 00000000 w 11111111 zamiast 00000001, jak myślę, że oczekujesz.

Jeśli masz bools można użyć:

Alpha.b = !(Alpha.a) 

ale jeśli nie można użyć if/else logikę:

if (Alpha.a == 0) 
{ 
    Alpha.b = 1; 
} 
else 
{ 
    Alpha.b = 0; 
} 
+0

Próbuję utworzyć wiadomość, więc jeśli nie polecono jej ponownie na tym etapie mojego kodu – samprat

1

Miłym rozwiązaniem wieloplatformowym krzyż język ten wspólny problem:

Alpha.b = 1 - Alpha.a; 
0

Co powiesz na maskę pooperacyjną?

za pomocą liczb znaków szuka Bit0:

b = 0x01u & (~a); 

lub nawet

b = a^0x01u; 

lub "logicznych zwolennicy" (należy zwrócić true i false może różnić się od 0/1, jeśli chcesz! to "prawdziwa wartość logiczna" należy użyć TRUE i FALSE jeśli zdefiniowane.)

b = (1 != a)?(0u):(1u); 

Cheers