Mulțime pe biți

O mulţime de numere întregi poate fi reprezentată astfel: spunem că un număr i aparţine unei mulţimi S dacă bit-ul al i-lea din vectorul S are valoarea 1. Pentru eficientă, vectorul S va conţine date de tipul unsigned char. Implementati funcţii pentru:

  • adăugarea unui element în mulţime;
  • ştergerea unui element din mulţime;
  • ştergerea tuturor elementelor din mulţime;
  • verificare dacă mulţimea este vidă;
  • cardinalul mulţimii.

Realizaţi un program care, utilizând funcțiile definite anterior, citeşte 2 mulţimi A şi B şi afişează: AuB (reuniune), AnB (intersectie), A – B si B – A.

Exemplu de cod:

#define SET_SIZE    10

//definim tipul SET ca fiind un vector de SET_SIZE octeti:
typedef unsigned char SET[SET_SIZE];

//in multime vor putea fi memorate SET_SIZE * 8 numere
const unsigned int SET_LENGTH = SET_SIZE * 8;

//verifica daca un numar n apartine multimii S:
int apartine(SET S, unsigned int n) {
    static unsigned int MASK = 0x80;    //1000 0000

    //daca n poate fi marcat   si   daca bit-ul al n-lea este 1
    return (n < SET_LENGTH) && ( S[n/8] & (MASK >> (n%8)) );
}