Me recuerda un rompecabezas de la matemáticas que va así:
Dos matemáticos se encuentren en esa terrible reino donde el rey mata a menos que se realice algún mundano lógica de la tarea. No te muevas de ahí, es horrible.
Nuestros héroes deben voltear una moneda cada día, y al menos uno de ellos debe adivinar correctamente la del otro tipo de moneda o que ambos mueren. Naturalmente, ellos son capaces de vivir para siempre el uso de un pequeño truco (verdugos odio!)
¿Qué hacen ellos? Además, tienen una chico de adivinar lo que él le da, y el otro siempre adivinar lo que él no voltear. Así que si terminan volteando la misma cosa, el hombre que adivina mismo será correcta. Si terminan volteando el diferente, el otro chico va a ser la correcta.
Voy a emplear la lógica que se utiliza para resolver este rompecabezas para resolver nuestros rompecabezas de aquí.
Básicamente, vamos a usar el bit más significativo en la entero para almacenar si necesitamos o no para voltear signos. Es posible que cualquier bit iba a hacer, pero el MSB es el menos perjudicial para el número de que llegar a tener para el sacrificio. Estoy bastante seguro de que no, pero no puedo descartar.
Digamos que A
es nuestra bit más significativo, y S
es nuestra bit de signo. El resto de los bits de determinar la magnitud de N (Como ya he dicho, todavía no han concluido si el A
bits puede ser incluido en la magnitud, o si tenemos que sacrificar un poco de la "utilidad" de cara a la magnitud con el fin de servir como almacenamiento de datos sobre la etapa de la operación).
Esto le da 4 tipos de números:
S A
0 0 : N is a "small" positive number, perhaps 0.
0 1 : N is a "large" positive number
1 1 : N is a "small" negative number, perhaps -1
1 0 : N is a "large" negative number
Para cualquier número x (positivo o negativo), negando que la serie en general invierte tanto el bit S y el Un poco, a excepción de los especiales valores 0 y "el extraño número".
Podemos hacer esto con cualquier número de bits, por lo que para este ejemplo vamos a utilizar 8 bits de los números.
Nuestros 8 bits número será de 53, o 0b 0011 0101
. Nuestra misión será la de convertir esto en -53, o 1100 1011
Ahora ya estamos usando 1 bit para el signo, y 1 bit para nuestros propios fines, el rango de esta función tiene es de sólo 6 bits (a menos que realmente se mantiene para todos los 7 bits, no he probado esa condición).
La función opera de esta manera:
si A == S, flip A.
otra cosa voltear Una y luego se multiplica por el valor negativo 1.
Por lo F(0b 0011 0101) = 0b 0111 0101
. Cuando nos pasa esto a través de la función de nuevo, A
ya no igual S
. Así llega a la cláusula else, darle la vuelta a la A
bits (de vuelta a 53) y multiplicando por negativo 1.
Otro ejemplo, comenzando con -53 == 0b 1100 1011
:
F(0b 1100 1011) == 0b 1000 1011
A continuación, F(0b 1000 1011)
de aciertos de la cláusula else, orientando el Un poco para conseguir 0b 1100 1011
== -53, y, a continuación, negando el número para obtener +53 == 0b 0011 0101
.
Así que la idea es que nos estamos sacrificando la A
bits para los fines de F(x)
porque se debe obtener invierte cuando se ejecute el resultado a través de F
de nuevo. Tenga en cuenta que F(x)
por sí mismo no es particularmente útil función. También que esto puede no funcionar para los casos extremos (yo no lo he probado mucho. 0, MAX_VALUE, MIN_VALUE, y de -1 a todos los que vienen a la mente como casos de prueba.)