Bytes inversos de un número hexadecimal

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

Publicación traducida automáticamente

Artículo escrito por kani_26 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 *