Calcule el valor absoluto entero (abs) sin bifurcarse

No necesitamos hacer nada si un número es positivo. Queremos cambiar solo números negativos. Dado que los números negativos se almacenan en forma de complemento a 2 , para obtener el valor absoluto de un número negativo tenemos que alternar bits del número y sumar 1 al resultado.
Por ejemplo -2 en un sistema de 8 bits se almacena de la siguiente manera 1 1 1 1 1 1 1 0 donde el bit más a la izquierda es el bit de signo. Para obtener el valor absoluto de un número negativo, tenemos que alternar todos los bits y agregar 1 al número alternado, es decir, 0 0 0 0 0 0 0 1 + 1 dará el valor absoluto de 1 1 1 1 1 1 1 0. También recuerde, necesitamos hacer estas operaciones solo si el número es negativo (el bit de signo está configurado).
Método 1 
1) Establezca la máscara como desplazamiento a la derecha de un entero por 31 (suponiendo que los enteros se almacenan usando 32 bits). 
 

 mask = n>>31 

2) Para números negativos, el paso anterior establece la máscara como 1 1 1 1 1 1 1 1 y 0 0 0 0 0 0 0 0 para números positivos. Agregue la máscara al número dado. 
 

 mask + n 

3) XOR de mask +n y mask da el valor absoluto. 
 

 (mask + n)^mask 

Implementación: 

C++

#include <bits/stdc++.h>
using namespace std;
#define CHARBIT 8
 
/* This function will return absolute value of n*/
unsigned int getAbs(int n)
{
    int const mask = n >> (sizeof(int) * CHARBIT - 1);
    return ((n + mask) ^ mask);
}
 
/* Driver program to test above function */
int main()
{
    int n = -6;
    cout << "Absolute value of " << n << " is " << getAbs(n);
    return 0;
}
 
// This code is contributed by rathbhupendra

C

#include <stdio.h>
#define CHAR_BIT 8
 
/* This function will return absolute value of n*/
unsigned int getAbs(int n)
{
    int const mask = n >> (sizeof(int) * CHAR_BIT - 1);
    return ((n + mask) ^ mask);
}
 
/* Driver program to test above function */
int main()
{
    int n = -6;
    printf("Absolute value of %d is %u", n, getAbs(n));
 
    getchar();
    return 0;
}

Java

// Java implementation of above approach
class GFG {
 
    static final int CHAR_BIT = 8;
    static final int SIZE_INT = 8;
 
    /* This function will return absolute value of n*/
    static int getAbs(int n)
    {
        int mask = n >> (SIZE_INT * CHAR_BIT - 1);
        return ((n + mask) ^ mask);
    }
 
    /* Driver code */
    public static void main(String[] args)
    {
        int n = -6;
        System.out.print("Absolute value of " + n + " is " + getAbs(n));
    }
}
 
// This code is contributed by Rajput-Ji

Python3

# Python3 implementation of above approach
CHARBIT = 8;
SIZE_INT = 8;
 
# This function will return
# absolute value of n
def getAbs(n):
    mask = n >> (SIZE_INT * CHARBIT - 1);
    return ((n + mask) ^ mask);
 
# Driver Code
n = -6;
print("Absolute value of",n,"is",getAbs(n));
 
# This code is contributed by mits

C#

// C# implementation of above approach
using System;
 
class GFG {
 
    static int CHAR_BIT = 8;
    static int SIZE_INT = 8;
 
    /* This function will return absolute value of n*/
    static int getAbs(int n)
    {
        int mask = n >> (SIZE_INT * CHAR_BIT - 1);
        return ((n + mask) ^ mask);
    }
 
    /* Driver code */
    static void Main()
    {
        int n = -6;
        Console.Write("Absolute value of " + n + " is " + getAbs(n));
    }
}
 
// This code is contributed by mits

PHP

<?php
// PHP implementation of above approach
$CHARBIT = 8;
$SIZE_INT = 8;
 
// This function will return
// absolute value of n
function getAbs($n)
{
    global $SIZE_INT, $CHARBIT;
    $mask = $n >> ($SIZE_INT * $CHARBIT - 1);
    return (($n + $mask) ^ $mask);
}
 
// Driver Code
$n = -6;
echo "Absolute value of " . $n .
            " is " . getAbs($n);
 
// This code is contributed by mits
?>

Javascript

<script>
// javascript implementation of above approach   
var CHAR_BIT = 8;
var SIZE_INT = 8;
 
    /* This function will return absolute value of n */
    function getAbs(n)
    {
        var mask = n >> (SIZE_INT * CHAR_BIT - 1);
        return ((n + mask) ^ mask);
    }
 
    /* Driver code */
        var n = -6;
        document.write("Absolute value of " + n + " is " + getAbs(n));
 
// This code is contributed by shikhasingrajput
</script>

Producción: 
 

Absolute value of -6 is 6

Complejidad de tiempo: O(1)

Espacio Auxiliar: O(1)

Método 2: 
1) Establezca la máscara como desplazamiento a la derecha de un número entero por 31 (suponiendo que los números enteros se almacenan usando 32 bits). 
 

 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 

Implementación: 

C++

#include <bits/stdc++.h>
using namespace std;
 
/* This function will return absolute value of n*/
unsigned int getAbs(int n)
{
    int const mask = n >> (sizeof(int) * CHAR_BIT - 1);
    return ((n ^ mask) - mask);
}
 
/* Driver program to test above function */
int main()
{
    int n = -6;
    cout << "Absolute value of " << n << " is " << getAbs(n);
    return 0;
}
 
// This code is contributed by phalasi.

C

#include <stdio.h>
#include <limits.h> //to include CHAR_BIT
 
/* This function will return absolute value of n*/
unsigned int getAbs(int n)
{
    int const mask = n >> (sizeof(int) * CHAR_BIT - 1);
    return ((n ^ mask) - mask);
}
 
/* Driver program to test above function */
int main()
{
    int n = -6;
    printf("Absolute value of %d is %d\n", n, getAbs(n));
    return 0;
}

Java

// Java implementation of above approach
class GFG {
 
    /* This function will return absolute value of n*/
    static int getAbs(int n)
    {
        int mask = n >> (SIZE_INT * CHAR_BIT - 1);
        return ((n + mask) ^ mask);
    }
 
}
 
// This code is contributed by code_hunt.

Python3

import os
import sys
 
# This function will return absolute value of n
def getAbs(n):
  mask = n >> (sys.getsizeof(int()) * os.sysconf('SC_CHAR_BIT') - 1)
  return ((n ^ mask) - mask)
 
# Driver code
n = -6
print("The absolute value of", n, "is", getAbs(n))
 
# This code is contributed by phalasi.

C#

// C# implementation of above approach
using System;
 
public class GFG {
 
    static int CHAR_BIT = 8;
    static int SIZE_INT = 8;
   
    /* This function will return absolute value of n*/
    static int getAbs(int n)
    {
        int mask = n >> (SIZE_INT * CHAR_BIT - 1);
        return ((n + mask) ^ mask);
    }
}
 
// This code is contributed by Rajput-Ji

Javascript

// JavaScript code to implement the approach
 
/* This function will return absolute value of n*/
function getAbs(n)
{
    // note: the size of int is 256 bytes
    // and the size of char is 8 bytes
    const mask = n >> (256 * 8 - 1);
    return ((n ^ mask) - mask);
}
 
/* Driver program to test above function */
var n = -6;
console.log("Absolute value of %d is %d", n, getAbs(n));
 
 
// this code is contributed by phasing17.

Producción: 

Absolute value of -6 is 6

Complejidad de tiempo: O(1)

Espacio Auxiliar: O(1)

En máquinas donde la bifurcación es costosa, la expresión anterior puede ser más rápida que el enfoque obvio, r = (v < 0) ? -(unsigned)v : v, aunque el número de operaciones es el mismo.
Consulte esto para obtener más detalles sobre los dos métodos anteriores.
Escriba comentarios si encuentra alguna de las explicaciones/algoritmos anteriores incorrectos, o una mejor manera de resolver el mismo problema.
Referencias:  
http://graphics.stanford.edu/~seander/bithacks.html#IntegerAbs
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

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