int_max - get max int c++
¿Qué significa ~ 0 en este código? (8)
¿Cuál es el significado de ~ 0 en este código?
¿Alguien puede analizar este código por mí?
unsigned int Order(unsigned int maxPeriod = ~0) const
{
Point r = *this;
unsigned int n = 0;
while( r.x_ != 0 && r.y_ != 0 )
{
++n;
r += *this;
if ( n > maxPeriod ) break;
}
return n;
}
Básicamente, está diciendo que maxPeriod tiene un valor predeterminado de UINT_MAX. En lugar de escribirlo como UINT_MAX, el autor utilizó su conocimiento de los complementos para calcular el valor.
Si desea que el código sea un poco más legible en el futuro, incluya
#include <limits>
y cambia la llamada a leer
unsigned int Order(unsigned int maxPeriod = UINT_MAX) const
Ahora para explicar por qué ~ 0 es UINT_MAX. Ya que estamos tratando con un int, en el que 0 se representa con todos los bits cero (00000000). Sumando uno daría (00000001), agregando uno más daría (00000010), y uno más daría (00000011). Finalmente una adición más daría (00000100) porque los 1 llevan.
Para ints sin firmar, si repite el proceso ad-infiniteum, eventualmente tendrá todos los bits (11111111), y al agregar otro se desbordará la configuración del búfer y todos los bits volverán a cero. Esto significa que todos los bits de un número sin signo es el máximo que puede contener el tipo de datos (int en su caso).
La operación "~" cambia todos los bits de 0 a 1 o de 1 a 0, al invertir un entero cero (que tiene todos los bits de cero) le da efectivamente UINT_MAX. Entonces, básicamente, el código anterior optó por la computadora UINT_MAX en lugar de usar la copia definida por el sistema ubicada en #include <limits.h>
Como han dicho otros, ~ es el operador de complemento a nivel de bits (a veces también se lo denomina bit a bit). Es un operador unario, lo que significa que toma una sola entrada.
Los operadores bitwise tratan la entrada como un patrón de bits y realizan sus respectivas operaciones en cada bit individual y luego devuelven el patrón resultante. Aplicar el operador ~ al patrón de bits negará cada bit (cada cero se convierte en uno, cada uno se convierte en cero).
En el ejemplo que dio, la representación de bits del entero 0 es todos ceros. Por lo tanto, ~ 0 producirá un patrón de bits de todos. Aunque 0 es un int, es el patrón de bits ~ 0 el que se asigna a maxPeriod (no el valor int que estaría representado por dicho patrón de bits). Dado que maxPeriod es un int sin signo, se le asigna el valor de int sin signo representado por ~ 0 (un patrón de todos), que de hecho es el valor más alto que un int sin signo puede almacenar antes de ajustarse a 0.
Como otros han mencionado, el operador ~
realiza un complemento a nivel de bits. Sin embargo, el resultado de realizar la operación en un valor firmado no está definido por el estándar.
En particular, el valor de ~0
no necesita ser -1
, que probablemente sea el valor deseado. Estableciendo el argumento por defecto a
unsigned int maxPeriod = -1
haría que maxPeriod
contenga el valor más alto posible (firmado a conversión sin signo se define como un módulo de asignación 2**n
, donde n
es un número característico del tipo sin signo dado (el número de bits de representación)).
También tenga en cuenta que los argumentos predeterminados no son válidos en C.
En el ejemplo, probablemente sea un intento de generar el valor UINT_MAX. La técnica es posiblemente defectuosa por razones ya establecidas.
Sin embargo, la expresión tiene un uso legítimo para generar una máscara de bits con todos los bits establecidos utilizando una constante literal que es independiente del ancho de tipo; pero no es así como se usa en tu ejemplo.
Es el único complemento, que invierte todos los bits.
~ 0101 => 1010
~ 0000 => 1111
~ 1111 => 0000
Es el complemento a nivel de bit de 0 que sería, en este ejemplo, un int con todos los bits establecidos en 1. Si sizeof (int) es 4, entonces el número es 0xffffffff.
Es una función de complemento binario.
Básicamente significa voltear cada bit.
~0
es el complemento a nivel de bit de 0
, que es un número con todos los bits rellenados. Para un int de 32 bits sin firmar, eso es 0xffffffff
. El número exacto de f
s dependerá del tamaño del valor al que asigne ~0
.