Klasa java.util.BitSet
Tworzymy klasę BitSetTest
z metodą main
Tworzymy pusty obiekt klasy BitSet:
BitSet bits1 = new BitSet();
Następnie umieszczamy w nim 10 liczb, od 0 do 9;
bits1.set(0, 10);
Jeżeli wydrukujemy zbiór na konsoli:
System.out.println(bits1);
zobaczymy liczby:
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
Możemy to sobie wyobrazić następująco:
indeksy | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|---|
bity | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
Nasze liczby są indeksami w tablicy, a to czy liczby brane są pod uwagę zależy od wartości bitu. Jeżeli pod indeksem jest 0 – liczby w zbiorze nie ma. Jeżeli pod liczbą jest 1 – liczba w zbiorze jest.
Dodajemy następny zbiór bitów:
BitSet bits2 = new BitSet();
Dodajemy liczby od 5 do 14:
bits2.set(5, 15, true);
Drukujemy na konsoli:
System.out.println(bits2);
I otrzymujemy wynik:
{5, 6, 7, 8, 9, 10, 11, 12, 13, 14}
Możemy to sobie wyobrazić tak:
indeksy | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
bity | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
Spójniki logiczne
Wykaz spójniow logicznych:
p | q | 1 | AND | 3 | 4 | NOR | 6 | 7 | NXOR | XOR | 10 | 11 | OR | IMPR | IMP | NAND | 16 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 1 |
1 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 1 | 1 |
0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 1 |
0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 1 |
Spójniki stosowane oznaczone są nazwami. Spójniki nie używane – cyframi.
Wykaz oznaczeń:
AND = koniunkcja = p i q
OR = lub = alternatywa
NAND = zaprzeczenie koniunkcji = dysjunkcja Sheffera
NOR = zaprzeczenie alternatywy = „ani p ani q” = binegacja
XOR = albo p albo q = alternatywa wyłączająca = nierównoważność
NXOR = „i p i q” = dopasowanie = równoważność = p jest równoważne z q = <=>
IMP = implikacja = „jeśli p to q” = p -> q = „z p wynika q”
IMPR = implikacja odwrotna = p<-q
Operacja 'AND’
Wykonujemy operację 'AND’ na bitach obu zbiorów. Operacje wykonywane są dla pary bitów umieszczonych pod tym samym indeksem w obu zbiorach. Jak pamiętamy operacja 'AND’ oznacza, że w wyniku znajdą się jedynie liczby (indeksy) pod którymi znajdują się jednocześnie jedynki.
W naszym przykładzie wynik jest umieszczony w zestawie uruchamiającym metody, czyli w bits2
. Zestaw bits1
pozostaje bez zmian.
bits2.and(bits1);
Drukujemy wynik na konsoli:
System.out.println(bits2);
Otrzymujemy:
{5, 6, 7, 8, 9}
Możemy to sobie wyobrazić tak:
indeksy | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
bits1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 |
bits2 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
bits2 po wykonaniu 'AND’ | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 |
Operacja 'OR’
Podobnie można wykonać operację 'OR’. Operacje wykonywane są dla pary bitów umieszczonych pod tym samym indeksem w obu zbiorach. Jak pamiętamy operacja 'AND’ oznacza, że w wyniku znajdą się jedynie liczby (indeksy) jeśli przynajmniej pod jednym indeksem z pary znajduje się jedynka.
bits2.or(bits1); System.out.println(bits2);
W wyniku otrzymamy:
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}
Możemy to sobie wyobrazić tak:
indeksy | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
bits1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 |
bits2 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
bits2 po wykonaniu 'OR’ | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
Operacja 'XOR’
Podobnie można wykonać operację 'XOR’. Operacje wykonywane są dla pary bitów umieszczonych pod tym samym indeksem w obu zbiorach. Jak pamiętamy operacja 'XOR’ oznacza, że w wyniku znajdą się jedynie liczby (indeksy) jeśli pod jednym indeksem z pary znajduje się jedynka, a pod drugim zero albo odwrotnie.
bits2.xor(bits1); System.out.println(bits2);
W wyniku otrzymujemy:
{0, 1, 2, 3, 4, 10, 11, 12, 13, 14}
Możemy to sobie wyobrazić następująco:
indeksy | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
bits1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 |
bits2 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
bits2 po wykonaniu 'XOR’ | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 |
Klasa BitSetTest
package java_util_bitset; import java.util.*; public class BitSetTest{ public static void main(String[] args) { BitSet bits1 = new BitSet(); bits1.set(0, 10); System.out.println(bits1); BitSet bits2 = new BitSet(); bits2.set(5, 15, true); System.out.println(bits2); //bits2.and(bits1); //bits2.or(bits1); bits2.xor(bits1); System.out.println(bits2); } }
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9} {5, 6, 7, 8, 9, 10, 11, 12, 13, 14} {0, 1, 2, 3, 4, 10, 11, 12, 13, 14}