Dado un entero sin signo N . La tarea es invertir todos los bytes de N sin usar una variable temporal e imprimir el número invertido. Ejemplos:
Entrada: N = 0xaabbccdd Salida: 0xddccbbaa Entrada: N = 0xa912cbd4 Salida: 0xd4cb12a9
El enfoque ingenuo es extraer el byte apropiado y usar máscara (&) con operadores de cambio.
#define REV(x) ( ((x&0xff000000)>>24) | (((x&0x00ff0000)<<8)>>16) | (((x&0x0000ff00)>>8)<<16) | ((x&0x000000ff) << 24) )
Enfoque eficiente: la idea es usar solo operadores de turno.
- Mueva la posición del último byte al primer byte usando el operador de desplazamiento a la izquierda (<<).
- Mueva la posición del primer byte al último byte usando el operador de desplazamiento a la derecha (>>).
- Mueva los bytes del medio usando la combinación de operador de desplazamiento a la izquierda y desplazamiento a la derecha.
- Aplique OR lógico (|) a la salida de todas las expresiones anteriores para obtener la salida deseada.
A continuación se muestra la implementación del enfoque anterior:
C
// C program to reverse bytes of a hexadecimal number #include <stdio.h> // macro which reverse the hexadecimal integer #define REV(n) ((n << 24) | (((n>>16)<<24)>>16) | (((n<<16)>>24)<<16) | (n>>24)) // Driver code int main() { unsigned int n = 0xa912cbd4; // n = 0xaabbccdd // (n >> 24) - 0x000000aa // (n << 24) - 0xdd000000 // (((n >> 16) << 24) >> 16) - 0xbb00 // (((n >> 8) << 24) >> 8) - 0xcc0000 // If output of all the above expression is // OR'ed then it results in 0xddccbbaa printf("%x is reversed to %x", n, REV(n)); return 0; }
Java
// Java program to reverse bytes of a hexadecimal number class GFG { public static int REV(int n) { return ((n >> 24) & 0xff) | // (n >> 24) - 0x000000aa ((n << 8) & 0xff0000) | // (n << 24) - 0xdd000000 ((n >> 8) & 0xff00) | // (((n >> 16) << 24) >> 16) - 0xbb00 ((n << 24) & 0xff000000); // (((n >> 8) << 24) // >> 8) - 0xcc0000 // If output of all the above expression is // OR'ed then it results in 0xddccbbaa } public static void main(String[] args) { int n = 0xa912cbd4; System.out.println(Integer.toHexString(n) + " is reversed to " + Integer.toHexString(REV(n))); } } //this code is contributed by phasing17
C#
// C# program to reverse bytes of a hexadecimal number using System; class GFG { public static ulong REV(uint n) { return (ulong)((n >> 24) & 0xff) | // (n >> 24) - 0x000000aa (ulong)((n << 8) & 0xff0000) | // (n << 24) - 0xdd000000 (ulong)((n >> 8) & 0xff00) | // (((n >> 16) << 24) >> 16) - 0xbb00 (ulong)((n << 24) & 0xff000000); // (((n >> 8) << 24) // >> 8) - 0xcc0000 // If output of all the above expression is // OR'ed then it results in 0xddccbbaa } // Driver code public static void Main(string[] args) { uint n = 0xa912cbd4; // Function call Console.WriteLine(n.ToString("X") + " is reversed to " + REV(n).ToString("X")); } } // This code is contributed by phasing17
Producción:
a912cbd4 is reversed to d4cb12a9