En programación, ¿qué devuelve n & -n?

n & -n devuelve el 1 bit más a la derecha en n .

Una nota rápida para las personas que no están familiarizadas con la sintaxis tipo C: el operador & es un AND bit a bit. Esto significa tomar dos números y combinarlos bit por bit, produciendo un 1 solo si ambas entradas son también 1. Aquí hay un ejemplo rápido:

  11010101
 01001100
 --------
 01000100

Ahora, veamos cómo funciona la negación con números binarios. En general, almacenamos enteros como 1 o 2 como números de 32 o 64 bits. Sin embargo, por simplicidad, imaginemos que solo estamos trabajando con 8 bits; los principios son los mismos. Entonces 11, por ejemplo, se vería así:

  00001011

Una manera simple de hacer negación es el llamado “complemento de uno”. Para hacer un número negativo, todo lo que hacemos es voltear todos los bits. Entonces -11 sería:

  11110100

Si este fuera realmente el método que utilizamos, entonces n & -n siempre sería 0. Dado que complementamos el número, ¡ni un solo bit permanece sin cambios!

Sin embargo, en realidad, utilizamos un método ligeramente diferente para hacer la negación: “complemento de dos”. Para obtener -11, primero volteamos todos los bits y luego agregamos 1 al resultado. Entonces obtendríamos:

  11110101

Como agregamos 1 al resultado anterior, siempre habrá exactamente 1 bit que sea 1 entre ambos números. En este caso, es el bit más a la derecha, por lo que 11 y -11 es 1. La razón por la que funcionó es que no tuvimos que cargar ningún bit después de sumar 1 al número complementado.

Ahora veamos 12 y -12. 12 es 00001100 ; la versión invertida es 11110011 . Si agregamos 1 a 11110011 , necesitaríamos llevar dos veces: 11110100 . Ahora mira cómo se juntan:

  00001100
 11110100
 --------
 00000100

Entonces, el resultado de 12 y -12 es 4, que es el bit al que teníamos que llevar nuestra adición. ¡Y esto siempre es igual al 1 más a la derecha en el número positivo!

Por eso, n & -n devuelve el 1 bit más a la derecha en n. También tenga en cuenta cómo, gracias al complemento de dos, el 1 bit más a la derecha en n es también el 1 bit más a la derecha en -n.

Trucos similares

Una buena fuente para encontrar trucos similares de bit-twiddling es el libro Hacker’s Delight que contiene un montón de tales trucos, que varían en complejidad, con explicaciones.

Otra opción es escribir un programa de computadora que busque programas eficientes de giro de bits como este: un superoptimizador. El sitio web de Hacker’s Delight en realidad contiene un superoptimizador muy simple al que llama “Asistente de Hacker”.

El libro también ha sido una fuente de puntos de referencia para nuevos sistemas de superoptimización como STOKE. ¡En algunos casos, el superoptimizador incluso logró encontrar programas algorítmicamente distintos para las mismas tareas!

More Interesting

¿Cómo se usan las matemáticas discretas en el aprendizaje automático?

Sistemas distribuidos: ¿El resultado de imposibilidad de FLP y el teorema de CAP de Brewer son básicamente equivalentes?

¿Cuál es el tipo de datos de optimización de memoria más apropiado en Matlab para importar un archivo de audio que tiene un valor máximo de 0.495971679687500 y el valor mínimo es -0.488983154296875?

Criptografía: ¿Cuál es una explicación intuitiva del algoritmo de cifrado RC4 y sus debilidades?

¿Cómo puedo calcular el número esperado de aciertos de caché?

¿Es el código de computadora una forma de representación matemática?

Cómo explicar la organización de un microprocesador / microordenador

¿Por qué el hardware de gráficos solo representa triángulos?

Como estudiante graduado de física teórica, ¿cómo puedo pasar a la investigación teórica en informática?

Cómo resolver la siguiente ecuación recursiva

¿Por qué razón se prefieren los operadores de asignación compuesta aritmética al escribir códigos profesionalmente en Java?

Estoy tomando SL Maths para el Diploma IB, ¿sería esto suficiente para universidades como UCB, UCLA, GaTech for Computer Science?

Soy muy rápido en los cálculos matemáticos y me encantan las matemáticas. ¿En qué opciones de carrera puedo dar lo mejor?

Mi computadora portátil está enchufada pero no se carga. ¿Cómo soluciono este problema?

Si un ciclo se ejecuta infinitas veces, ¿por qué recibimos un error de tiempo de ejecución en lugar de un error de límite de tiempo excedido? Además, ¿cuál es el valor de infinito para los compiladores en línea?