¿La verificación condicional para “i == (2 ^ 8)” falla cuando i es 512?

Aquí hay un pequeño progtwig para imprimir poderes de 2 a 8. Pero no se va a dejar después de 8. Por favor, explique la razón.

#include  #include  int main(void) { unsigned int i=1; while(1) { i = i<<1; printf("i = %d\n",i); if(i==(2^8)) break; sleep(1); } printf("Exited While loop.. \n"); return 0; } 

El bucle no está saliendo cuando i = 2 ^ 8. Mi salida es algo como esto:

 i = 2 i = 4 i = 8 i = 16 i = 32 i = 64 i = 128 i = 256 i = 512 (Should have Exited here. But the program is continuing. Why?) i = 1024 i = 2048 i = 4096.... 

EDITAR:

Gracias por responder que ^ es un operador XOR. Pero ahora el código de abajo se está comportando extraño. Por favor explique.

 #include  int main(void) { if((2)^8 == 1<<8) { printf("True.. \n"); } else { printf("False..!!"); } return 0; } 

El progtwig de la función anterior imprime verdadero.

En C, el operador ^ significa XOR (bitwise exclusivo o).

Para obtener 2 a la potencia de 8, necesita usar un bucle (res * = 2 en un bucle), o redondear la función pow en math.h (tenga en cuenta que la función math.h devuelve float, y por lo tanto no ganará) t sea igual al entero).

El método más simple es el cambio a nivel de bits, por supuesto.

Acerca de la sección de edición:

Bienvenido al maravilloso mundo de la precedencia del operador . Lo que sucede es que == tiene mayor prioridad que ^, y por lo tanto, el condicional se evalúa como 2 ^ 0, que es 2, que es verdadero.

Para que funcione, necesitas agregar paréntesis:

 if ( (2^8) == (1<<8) ) ... 

El problema es que ^ es el operador Xwise de Bitwise , no se eleva a la potencia. Vamos a explicar 2^8 en formato bit a bit:

 2 = 0010 8 = 1000 ======== xor 10= 1010 

por lo tanto, el resultado, aplicando xor a bit, es 10, eso nunca sucede, por lo que su bucle nunca sale. Puede hacer que su prueba de unidad funcione si usa pow(2,8) y redondear a entero en su lugar.

Otra información, probablemente no sea el caso en este ejemplo, pero es mejor evitar la igualdad estricta cuando se trabaja con valores de punto flotante, comparar con un épsilon es mejor.

Para su edición: Asegure la precedencia con esto:

 if((2^8) == (1<<8)) 

Esto devolverá falso, como se esperaba.

2^8 es 2 XOR 8 , es decir. 10, no 256. por lo tanto, su bucle no se detiene. Probablemente quiera verificar (1<<8) o 256 específicamente.

^ no es potencia en c, significa XOR . 2 ^ 8 == 10 y no será igual a i en este código.

^ es XOR a nivel de bits, la función que está buscando es pow in math.h 🙂

Para su sección de edición

 #include  int main() { if((2^8) == (1<<8)) { printf("True.. \n"); } else { printf("False..!!"); } return 0; } 

Volverá Falso .