// Umwandlung Big Endian / Little Endian mit Bitoperationen und Schleife
//
// Aufruf: endian-loop n
//
// Klaus Kusche, 2010

#include <stdio.h>
#include <stdlib.h>

int main(int argc, const char *argv[])
{
  if (argc != 2) {
    fprintf(stderr, "Aufruf: %s n\n", argv[0]);
    exit(EXIT_FAILURE);
  }

  // bei normalem "int" könnte es Überraschungen bei >> geben! 
  //unsigned int input, original, reverse, byte;
  //unsigned short input, original, reverse, byte;
  unsigned long long input, original, reverse, byte;
  //input = original = atoi(argv[1]);
  //input = original = atoi(argv[1]);
  input = original = atoll(argv[1]);
  reverse = 0;

  // sizeof(...) liefert die Größe einer Variable in Bytes
  for (int i = 0; i < sizeof(input); ++i) {
    byte = input & 0xff;  // hintestes Byte aus dem Input herausholen
    input >>= 8;          // ... und aus dem Input wegschieben
    reverse <<= 8;        // Bisheriges Ergebnis 1 Byte nach vor schieben
    reverse |= byte;      // ... und neues Byte hinten dazutun
  }

  //printf("Original: %08x, Bytes swapped: %08x\n", original, reverse);
  //printf("Original: %04hx, Bytes swapped: %04hx\n", original, reverse);
  printf("Original: %016llx, Bytes swapped: %016llx\n", original, reverse);

  exit(EXIT_SUCCESS);
}
