2011-06-28 16 views
12

[cómo usar ~ operador]cómo usar inverso en C

Tengo una estructura decir Alpha. Sé el valor del elemento dentro de Alpha (digamos a) que puede ser 0 o 1 - Quiero que el otro elemento de la misma estructura tome el valor inverso de Alpha.a. Por ejemplo:

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

y viceversa

que he intentado:

Alpha.b = ~ (Alpha.a) 

Pero, desgraciadamente, no funciona - cuando Alpha.a es 1, Alpha.b consigue el sistema de 254

Todas las ideas ?

Gracias y saludos,

SamPrat

+6

** ¿Por qué no funciona? ¿Qué sucede? ** – SLaks

+0

muestra que es el valor 254 – samprat

+2

Hola chicos, estoy ansioso por saber por qué mi pregunta está abajo votó para que la próxima vez remito mi error? – samprat

Respuesta

22

Uso XOR operador:

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

esto funcione sin problemas – samprat

+0

Muchas gracias por su rápida ayuda – samprat

0

que desea utilizar otro operador. ¡Específicamente!

Alpha.b = !Alpha.a 

Dado que los valores son cero o uno, es mucho más simple.

+0

también lo intenté. no funciona – samprat

+8

** ¿Por qué no? ¿Qué sucede? ** – SLaks

3

El operador ~ niega cada bit individual. Por ejemplo, suponga que Alpha.a es un unsigned char. Entonces ~1 leería, en formato binario como, ~ 00000001, y el resultado sería 11111110 (nuevamente, en binario), que es lo mismo que 254 en decimal y 0xFE en hexadecimal.

Como han sugerido otros, utilice !Alpha.a o Alpha.a^1.

29

En C, true está representado por 1 y false por 0. Sin embargo, en una comparación, cualquier valor no falso se trata como verdadero.

El operador booleano ! hace inversión, por lo que 0 es 1 y! 1 es 0.

El operador ~, sin embargo, hace bit a bit de inversión, donde cada bit en el valor se sustituye con su inverso. Entonces ~ 0 es 0xffffffff (-1). ~ 1 es 0xfffffffe (-2). (Y ambos -1 y -2 se consideran verdaderos, lo que probablemente sea lo que lo confunde.)

Lo que quiere es !, en lugar de ~.

0

No puede usar ~ ya que esto convertirá 00000000 en en lugar de 00000001 como creo que está esperando.

Si tiene Bools puede utilizar:

Alpha.b = !(Alpha.a) 

pero si no es posible que tenga que utilizar si/lógica más:

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

Estoy tratando de compilar un mensaje, de modo que si no se renombra en esta etapa de mi código – samprat

1

Una solución multiplataforma lenguajes agradable a esta común el problema es:

Alpha.b = 1 - Alpha.a; 
0

¿Qué tal una máscara de bits posoperatoria?

usando caracteres sin signo que buscan bit 0:

b = 0x01u & (~a); 

o incluso

b = a^0x01u; 

o "booleanas-pensadores" (tener en cuenta VERDADERO y FALSO se ajuste exactamente a 0/1 si quieres! que "booleano verdadero" se debe utilizar vERDADERO y FALSO si se ha definido.)

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

Saludos