/*********************************************
 * Acest program prezinta niste metode de    *
 * accesare a memoriei la nivel de bit.      *
 *                                           *
 * In program se declara niste variabile     *
 * de diferite tipuri, care se initializeaza *
 * cu niste valori si apoi se afiseaza       *
 * continutul lor bit cu bit.                *
 *                                           *
 *      Copyright (C) Uzun Dumitru 2008      *
 *********************************************/


//Scoate barele de comentariu de mai jos daca doresti sa se separe semioctetii prin spatii

//#define SPATII

//-------------------------------------------------
#if defined(SPATII)
	#define PUNESPATII printf(" ")
#else
	#define PUNESPATII
#endif
//-------------------------------------------------
#include <stdio.h>
#include <conio.h>
//-------------------------------------------------
#define pBit(addr, bit) ( ( ((char*)(addr))[bit>>3] & (1<<((bit)&7)) ) != 0 )   // Valoarea bitului nr bit de la adresa addr
#define pBitSet(addr, bit, val) (((char*)(addr))[bit>>3]^= ( ((char*)(addr))[bit>>3] & (1<<((bit)&7)) )^(((val)!=0))<<((bit)&7))
#define var_bits(var) show_bits(&var, sizeof(var)<<3)
//-------------------------------------------------
void show_bits(void*, size_t);  // Afiseaza un nr de bitsi de la adresa indicata
//-------------------------------------------------
void main(void)
{
//     clrscr();
//-------------------------------------------------
     /* Variabile pentru testare */
     char c         = 0;
     int i          = -32768;
     long int l     = 0x0f00ff0f;
     float f        = 123.5;
     double d       = 0.000123456;
     long double ld = 1246.123456;
//-------------------------------------------------
    /* Afisarea variabilelor bit cu bit */
    var_bits(c);
    var_bits(i);
    var_bits(l);
    var_bits(f);
    var_bits(d);
    var_bits(ld);
    printf("\n");
//-------------------------------------------------
    getch();
}
//-------------------------------------------------
void show_bits(void *var, size_t bits){
     while (bits--)
     {
	     printf("%c", '0'+pBit(var, bits));
	     if(!(bits&3)) PUNESPATII;
     }
     printf("\n");
}
//-------------------------------------------------
#define pByteBit(addr, B, bit) pBit((char*)(addr)+(B), bit)  // Valoarea bitului 'bit' al byte-ului 'B' de la adresa 'addr'
//-------------------------------------------------
