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