#include <stdio.h>
#include <limits.h>
#define SEVEN_BIT 7


typedef unsigned char BIT_TYPE;
#define BIT_NBIT (CHAR_BIT * sizeof(BIT_TYPE))
#define BIT_SIZE(N) (((N) + BIT_NBIT-1) / BIT_NBIT)

#define BIT_ELNUM(N) ((N)/BIT_NBIT)
#define BIT_NUM(N) ((N) % BIT_NBIT)

#define BIT_ZERO(bit_array, N)\
        memset(bit_array,0,BIT_SIZE(N)*sizeof(BIT_TYPE))

#define BIT_SET(bit_array, N) \
        ((bit_array)[BIT_ELNUM(N)] |= (BIT_TYPE)1 << BIT_NUM(N))
#define BIT_CLEAR(bit_array, N) \
        ((bit_array)[BIT_ELNUM(N)] &= ~((BIT_TYPE)1 << BIT_NUM(N)))
#define BIT_TEST(bit_array, N) \
        ((bit_array)[BIT_ELNUM(N)]& ((BIT_TYPE)1 << BIT_NUM(N)))

/*Alle Bits auf 1 setzen*/
void setall(BIT_TYPE *b)
{
 int i;
 for(i=0; i<SEVEN_BIT; i++)
  if(BIT_SET(b,i))
    printf("Bit %d gesetzt\n",i+1);
  else
    printf("Bit %d nicht gesetzt\n",i+1);
}


int main()
{
 BIT_TYPE bit_array[BIT_SIZE(SEVEN_BIT)];
 int i;

 /*Alle Bits mit 0 initialisieren*/
 BIT_ZERO(bit_array, SEVEN_BIT);

 /*Testen ob wir Bit 4 gesetzt wurde*/
 if(BIT_TEST(bit_array, 3))
  printf("Bit 4 ist bereits gesetzt\n");
 else
  printf("Bit 4 ist noch nicht gesetzt\n");

 /*Jetzt setzen wir Bit 3 und überprüfen das gleich*/
 if(BIT_SET(bit_array, 3))
   if(BIT_TEST(bit_array, 3))
     printf("Bit 4 wurde gesetzt\n");
   else
     printf("Bit 4 konnte nicht gesetzt werden\n");

 printf("Momentane Bitdarstellung : ");
 for(i=0; i<SEVEN_BIT; i++)
   printf("%d",BIT_TEST(bit_array,i) ?1 :0);
 printf("\n");

 /*Bit 4 wieder löschen und ausgeben*/
 BIT_CLEAR(bit_array, 3);
  printf("Momentane Bitdarstellung (Nach BIT_CLEAR) : ");
 for(i=0; i<SEVEN_BIT; i++)
   printf("%d",BIT_TEST(bit_array,i) ?1 :0);
 printf("\n");

 /*Funktion mit der wir alle Bits auf 1 setzen*/
 setall(bit_array);
 /*Zur überprüfung*/
 printf("Momentane Bitdarstellung (Nach setall) : ");
 for(i=0; i<SEVEN_BIT; i++)
   printf("%d",BIT_TEST(bit_array,i) ?1 :0);
 printf("\n");

 /*Alle Bits wieder löschen*/
 BIT_ZERO(bit_array, SEVEN_BIT);
 /*und...*/
 printf("Momentane Bitdarstellung (Nach BIT_ZERO) : ");
 for(i=0; i<SEVEN_BIT; i++)
   printf("%d",BIT_TEST(bit_array,i) ?1 :0);
 printf("\n");

 return 0;
}
