// n-te Hexziffer einer Zahl
// n beginnt bei der vordersten echten Stelle von z (ohne führende Nullen)
// mit 1 zu zählen
//
// Aufruf: hexdigit z n
//
// Klaus Kusche, 2024

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

// wir schieben nach rechts, das würde mit normalen int's falsch rechnen
typedef unsigned int uint;

int hexdigit(uint z, uint n)
{
  uint digits = 0;  // tatsächliche Länge der Zahl (Anzahl der Hexziffern)

  // schiebe immer wieder die hinterste Hexziffer (= 4 bits) weg,
  // bis die Zahl 0 ist, und zähle, wie viele Ziffern weggeschoben wurden
  for (uint tmp = z; tmp > 0; tmp >>= 4) {
    ++digits;
  }

  if ((n == 0) || (n > digits)) {
    return -1;
  }

  // wie viele Bits muss ich z nach rechts schieben,
  // damit die gesuchte Hexziffer in den hintersten vier Bits steht?
  uint bits = (digits - n) << 2;  // .... << 2 statt ... * 4

  // gesuchte Hexziffer ganz nach hinten schieben,
  // alle Bits außer den hintersten 4 Bits wegmaskieren
  return (z >> bits) & 0xf;
}

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

  uint z = strtoul(argv[1], NULL, 0); // erlaubt Eingabe auch in hex
  uint n = atoi(argv[2]);
  // %u ... unsigned-Ausgabe
  // %08x ... hex-Ausgabe mit 8 Stellen und führenden Nullen
  printf("%u-th digit of %08x = %d\n", n, z, hexdigit(z, n));
  
  return 0;
}
