tag preguntas las kpop disney canciones c++ c bitwise-operators logical-operators

c++ - preguntas - NO(~) vs NEGACIÓN(!)



tag de las 30 canciones (3)

''~'' es el operador que: ~ x = -x-1 y cuando i = -1, entonces ~ i = 0. Si se pregunta el valor de ~ i, simplemente puede imprimirlos:

#include <iostream> using namespace std; int main(int argc, char *argv[]) { int i=-5; for (int i = -5; i <= 3; i++) { cout<<i<<" "<<(~i)<<endl; } }

y luego encontrarás: -5 4 -4 3 -3 2 -2 1 -1 0 0 -1 1 -2 2 -3 3 -4

#include <iostream> using namespace std; int main(int argc, char *argv[]) { int i=-5; while(~(i)) { cout<<i; ++i; } }

La salida es -5, -4, -3, -2. ¿No debería imprimir valores hasta -1? ¿Por qué es solo hasta -2? Y, por favor, explícame la diferencia entre los operadores ''no'' y ''negación''. Cuando escribo un programa, ellos fueron la fuente de errores.

while(i)

Sé que la condición de bucle será verdadera para i positivo y negativo, excepto 0.

while(!i) vs while(~i)

¿Para qué valores de ''i'' se ejecutan los dos bucles anteriores?


Cuando llego a -1 , el valor de ~i es ~-1 , o 0 , por lo while bucle while deja de ejecutarse. El El operador trabaja porque hace algo completamente diferente; da como resultado 1 para 0 valores y 0 para todos los demás valores. ~ es una negación a nivel de bit.

Un poco más en detalle:

  • ~ toma cada bit en un número y lo alterna. Así, por ejemplo, 10010 2 se convertiría en 01101 2.
  • -1 es todos los unos en binario cuando un entero con signo de complemento a dos.
  • ~0b…11111111 es 0 .

Sin embargo:

  • !0 es 1 !anythingElse es 0
  • -1 no es 0
  • !-1 sigue siendo 0

Y si realmente quieres hacer un bucle incluyendo i == -1 , solo usa while (i) lugar de while (~i) .


Tiene razón en que i == -1 es la condición de salida: su bucle es equivalente a

int i=-5; while(i != -1) { cout<<i; ++i; } // i == -1 immediately after the loop

Cuando se escribe de esta manera, debe quedar claro por qué -1 no se imprime, el valor se imprime primero y solo luego se incrementa, por eso -2 es el último valor que imprime.

El operador, por otro lado, producirá 1 solo cuando se le da un cero. Es por eso que el bucle se imprimiría -1 cuando el ! operador se utiliza en la condición de bucle.