Es fundamental comprender el código bien antes de usarlo a tu trabajo y si tdeseas aportar algo puedes dejarlo en la sección de comentarios.
Solución:
Igual que las respuestas existentes, pero con más explicaciones:
Supongamos un número de complemento a dos (como es el caso habitual y no dice lo contrario) y supongamos 32 bits:
Primero, realizamos un desplazamiento aritmético a la derecha de 31 bits. Esto cambia en todos 1
s para un número negativo o todos 0
s para uno positivo (pero tenga en cuenta que el real >>
-El comportamiento del operador en C o C++ está definido por la implementación para números negativos, pero generalmente también realizará un cambio aritmético, pero supongamos un pseudocódigo o instrucciones de hardware reales, ya que de todos modos suena como tarea):
mask = x >> 31;
Entonces lo que obtenemos es 111...111
(-1) para números negativos y 000...000
(0) para positivos
Ahora hacemos XOR esto con x
obteniendo el comportamiento de un NOT para mask=111...111
(negativo) y un no-op para mask=000...000
(positivo):
x = x XOR mask;
Y finalmente reste nuestra máscara, lo que significa +1 para negativos y +0/no-op para positivos:
x = x - mask;
Entonces, para los positivos, realizamos un XOR con 0 y una resta de 0 y así obtenemos el mismo número. Y para los negativos, tenemos (NOT x) + 1
que es exactamente -x
cuando se utiliza la representación de complemento a dos.
-
Establezca la máscara como desplazamiento a la derecha de un entero por 31 (suponiendo que los enteros se almacenan como valores de 32 bits en complemento a dos y que el operador de desplazamiento a la derecha sí firma la extensión).
mask = n>>31
-
XOR la máscara con número
mask ^ n
-
Reste la máscara del resultado del paso 2 y devuelva el resultado.
(mask^n) - mask
Asumir int
es de 32 bits.
int my_abs(int x)
int y = (x >> 31);
return (x ^ y) - y;
Comentarios y calificaciones de la guía
Si eres capaz, eres capaz de dejar una noticia acerca de qué te ha gustado de este ensayo.