| |
|
SOFTWARE |
|
|
|
|
|
char *set = calloc((bits + CHAR_BIT - 1) / CHAR_BIT, sizeof(char));
return set;
}
/* Wert eines bestimmten Bits lesen
* Rueckgabewert: 0 oder 1
* Bei Betrachtung als Menge:
* 1: Element ist enthalten
* 0: Element ist nicht enthalten
*/
int liesbit(char *set, int number)
{
set += number / CHAR_BIT;
return (*set & (1 << (number % CHAR_BIT))) != 0;
}
/* ein bestimmtes Bit setzen
* Bei Betrachtung als Menge:
* 1: Element der Menge hinzufuegen
* 0: Element aus der Menge entfernen
*/
void setzebit(char *set, int number, int value)
{
set += number / CHAR_BIT;
if (value)
*set |= 1 << (number % CHAR_BIT); /* set bit */
else
*set &= ~(1 << (number % CHAR_BIT)); /* clear bit */
}
/* ein bestimmtes Bit invertieren
* (0 -> 1 bzw. 1 -> 0
*/
void invertbit(char *set, int number)
{
set += number / CHAR_BIT;
*set ^= 1 << (number % CHAR_BIT);
}
/* Schnittmenge von set1 und set2 berechnen
* (bitweise UND-Verknuepfung)
* Rueckgabewert in set3
* Der Parameter 'bits' muss den gleichen Wert wie bei
* 'alloc_bitarray' haben!
*/
void schnitt(char *set1, char *set2, char *result, size_t bits)
{
int i;
for (i = 0; i <= (bits + CHAR_BIT - 1) / CHAR_BIT; i++)
{
*result = *set1 & *set2;
result++; set1++;set2++;
}
}
/* Vereinigungsmenge von set1 und set2 berechnen
* (bitweise ODER-Verknuepfung)
* Rueckgabewert in set3
* Der Parameter 'bits' muss den gleichen Wert wie bei
* 'alloc_bitarray' haben!
*/
void vereinigung(char *set1, char *set2, char *result, size_t bits)
{
int i;
for (i = 0; i <= (bits + CHAR_BIT - 1) / CHAR_BIT; i++)
{
*result = *set1 | *set2;
result++; set1++;set2++;
}
}
/* Bitweise Ausgabe einer Menge (0 oder 1)
* Der Parameter 'bits' muss den gleichen Wert wie bei
* 'alloc_bitarray' haben!
*/
void print_bitarray(char *set, size_t bits)
{
int i, j;
for (i = 0; i < (bits + CHAR_BIT - 1) / CHAR_BIT; i++)
{
for (j = 0; j < CHAR_BIT; j++)
if (*set & (1 << j)) putchar('1');
else putchar('0');
set++;
}
putchar('\n');
}
/* Testprogramm */
int main ()
{
char *Menge1, *Menge2, *Menge3;
Menge1 = alloc_bitarray(40);
Menge2 = alloc_bitarray(40);
Menge3 = alloc_bitarray(40);
setzebit(Menge1,0,1);
setzebit(Menge1,7,1);
setzebit(Menge1,20,1);
setzebit(Menge1,39,1);
setzebit(Menge2,0,1);
setzebit(Menge2,8,1);
setzebit(Menge2,21,1);
setzebit(Menge2,39,1);
printf(" 1 2 3 4\n");
printf("01234567890123456789012345678901234567890\n");
print_bitarray(Menge1,40);
print_bitarray(Menge2,40);
schnitt(Menge1, Menge2, Menge3,40);
print_bitarray(Menge3,40);
vereinigung(Menge1, Menge2, Menge3,40);
print_bitarray(Menge3,40);
return 0;
}
|
|
|
|
|
|