/* bitops1.c 
   Einige Bitfunktionen
   Enthaelt auch die Loesung der Aufgaben
   8.6 (andere Richtung), 8.7 (ohne Vorzeichen) des C-Buches
   Das niederwertigste Bit hat die  Nummer 0 !
*/

#include <stdio.h>
#include "bitops1.h"


/* positive Dualzahl lesen */

t_bitmuster DualIn(void)
{
   t_bitmuster z = 0;
   int c;

   printf("Dualzahl ? ");
   c = getchar();
   while ((c == '0') || (c == '1')) {
      z <<= 1;
      z += c - '0';
      c = getchar();
  }
   return z;
}

/* Binaerdarstellung des Wertes z */

void DualOut(t_bitmuster z, char endchar)
{
   t_bitmuster maske = 0;
   int n;

   n = 8*sizeof(t_bitmuster)-1;  /* 31, 15, 7 */
   maske = 1 << n;
   for (; n >= 0; n--) {
      putchar(z & maske ? '1' : '0');
      if (n % 8 == 0) putchar(' ');
      maske >>= 1;
  }
   putchar(endchar);
}

/* nach Links schieben mit Uebertrag des hoechstwertigen Bits
   zum niederwertigsten Bit */

void CircleShiftLeft( t_bitmuster *z, int n)
{
   int LeftBit;
   for (; n > 0; n--) {
     LeftBit = (1 << 8*sizeof(t_bitmuster)-1) & *z ? 1 : 0;
     *z <<= 1;
     *z += LeftBit;
  }
}

/* Bit Nr. n testen */

int TestBit( t_bitmuster z, int n)
{
  return (1 << n) & z ? 1 : 0;
}



/* bitops1test.c Testumgebung zu einigen Bitfunktionen */

#include <stdio.h>
#include "bitops1.h"

int main()
{
  t_bitmuster a;

  a = DualIn();
  while (a != 0) {
    DualOut(a, '\n');
    {
      int i;
         printf("Mehrmals nach links schieben\n");
      for (i = 0; i < sizeof(t_bitmuster) * 8; i++) {
      CircleShiftLeft(&a, 1);
      DualOut(a, '\n');
    }
    printf("Um 7 Positionen nach links schieben\n");
    CircleShiftLeft(&a, 7);
    DualOut(a, '\n');
    for (i = sizeof(t_bitmuster) * 8 - 1; i >= 0; i--)
      printf("%1i", TestBit(a, i));
    }
    printf("\n\n0 beendet den Test\n");
    a = DualIn();
  }

  return 0;
}



/* bitops1.h */

typedef unsigned char t_bitmuster;

t_bitmuster DualIn (void);
void DualOut (t_bitmuster z ,char endchar );
void CircleShiftLeft (t_bitmuster * z ,int n );
int TestBit (t_bitmuster z ,int n );