Saltar al contenido

Cómo calcular el valor absoluto entero

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 1s para un número negativo o todos 0s 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 xobteniendo 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) + 1que es exactamente -x cuando se utiliza la representación de complemento a dos.

  1. 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 
    
  2. XOR la ​​máscara con número

    mask ^ n 
    
  3. 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *