Es handelt sich hier um ein Beispiel für Abstraktion und Verfeinerung von Datentypen und Operatoren.
Eine Teilmenge M von {0,1,2, - - - ,31} wird folgendermaßen als Integer m codiert: i aus {0,1,2, - - - ,31} ist genau dann ein Element von M, wenn das Bit Nummer i im Integer m den Wert 1 hat.
(2^30)*bit30 + (2^29)*bit29 + ... + 2*bit1 + bit0
Es ist zu beachten, dass diese Interpretation in der folgenden Implementierung der Mengenoperatoren gar nicht benötigt wird.
Definiert in Zeile 30 der Datei Set32.java.
Öffentliche, statische Methoden | |
static void | main (String args[]) |
Hauptprogramm zum Test der Mengenoperationen auf Basis von Integercodierungen. | |
Statische Paketfunktionen | |
static int | getEmpty () |
getEmpty() liefert die leere Menge zurück. | |
static int | insertElem (int theSet, int theElem) |
insertElem() fügt ein Element in eine gegebene Menge ein. | |
static int | union (int set1, int set2) |
union() bildet die Vereinigung von 2 Mengen | |
static int | intersection (int set1, int set2) |
intersection() bildet den Durchschnitt von zwei Mengen | |
static int | setminus (int set1, int set2) |
setminus() bildet die mengentheoretische Differenz | |
static int | complement32 (int set1) |
complement32() bildet das Komplement einer Menge relativ zu {0, - - - , 31} | |
static void | alpha (String name, int theSet) |
alpha() abstrahiert als Integer codierte Mengen in die übliche Darstellung { element1, element2, - - - } |
|
alpha() abstrahiert als Integer codierte Mengen in die übliche Darstellung { element1, element2, - - - }
Definiert in Zeile 175 der Datei Set32.java. Wird benutzt von main(). 00175 { 00176 00177 boolean haveOneElement = false; 00178 00179 System.out.print(name + " = { "); 00180 00181 // Schleife über alle Bits, beginnend bei Bit0 00182 for (int i = 0; i < 32; i = i + 1) { 00183 00184 // Wenn Bit i in theSet gesetzt ist ... 00185 if ( (theSet & ( 1 << i )) != 0 ) { 00186 if ( haveOneElement ) { 00187 // Wenn vorher schon ein Element ausgegeben 00188 // wurde, Komma als Trenner setzen 00189 System.out.print(","); 00190 } 00191 // ... wird es als Element der Menge ausgegeben. 00192 System.out.print(i); 00193 haveOneElement = true; 00194 } 00195 } 00196 00197 System.out.println(" }"); 00198 00199 }
|
|
complement32() bildet das Komplement einer Menge relativ zu {0, - - - , 31}
Definiert in Zeile 151 der Datei Set32.java. Wird benutzt von main(). 00151 { 00152 00153 // ~set1 invertiert alle Bits, so dass im Ergebnis 00154 // Bit i genau dann gesetzt ist, wenn i nicht in set1 gesetzt 00155 // war. 00156 return ~set1; 00157 00158 }
|
|
getEmpty() liefert die leere Menge zurück.
Definiert in Zeile 39 der Datei Set32.java. Wird benutzt von main().
|
|
insertElem() fügt ein Element in eine gegebene Menge ein.
Definiert in Zeile 57 der Datei Set32.java. Wird benutzt von main(). 00057 { 00058 00059 if ( 0 <= theElem && theElem <= 31 ) { 00060 00061 // Der folgende Ausdruck setzt genau 00062 // das Bit Nummer theElem in theSet, 00063 // unabhängig davon, ob es vorher schon gesetzt 00064 // war oder nicht. Alle anderen Bits von theSet 00065 // bleiben unverändert. 00066 theSet = theSet | ( 1 << theElem ); 00067 00068 } 00069 00070 return theSet; 00071 00072 }
|
|
intersection() bildet den Durchschnitt von zwei Mengen
Definiert in Zeile 105 der Datei Set32.java. Wird benutzt von main(). 00105 { 00106 00107 // Das bitweise UND setzt alle Bits, die 00108 // bereits in set1 UND set2 gesetzt waren. 00109 // Dies entspricht in 00110 // der Abstraktion unter Alpha gerade der 00111 // mengentheoretischen Durchschnittsbildung. 00112 return set1 & set2; 00113 00114 }
|
|
Hauptprogramm zum Test der Mengenoperationen auf Basis von Integercodierungen.
Definiert in Zeile 205 der Datei Set32.java. Benutzt alpha(), complement32(), getEmpty(), insertElem(), intersection() und setminus(). 00205 { 00206 00207 00208 int s1; 00209 int s2; 00210 int s3; 00211 00212 // Erzeuge 2 leere Mengen 00213 s1 = getEmpty(); 00214 s2 = getEmpty(); 00215 00216 // Konstruiere s1 = { 1,5,31 } 00217 s1 = insertElem(s1,1); 00218 s1 = insertElem(s1,5); 00219 s1 = insertElem(s1,31); 00220 00221 // s1 ausgeben 00222 alpha("s1",s1); 00223 00224 // Konstruiere s2 = { 0,5,7,9,11 } 00225 s2 = insertElem(s2,0); 00226 s2 = insertElem(s2,5); 00227 s2 = insertElem(s2,7); 00228 s2 = insertElem(s2,9); 00229 s2 = insertElem(s2,11); 00230 00231 // s2 ausgeben 00232 alpha("s2",s2); 00233 00234 // ---- s1 union s2 ---------------------------------------------- 00235 System.out.println("Teste Vereiningung von s1 und s2"); 00236 System.out.println("Erwartetes Resultat: { 0,1,5,7,9,11,31 }"); 00237 00238 s3 = union(s1,s2); 00239 alpha("Resultat s1 union s2",s3); 00240 00241 // ---- s1 intersection s2 ---------------------------------------------- 00242 System.out.println("Teste Durchschnitt von s1 und s2"); 00243 System.out.println("Erwartetes Resultat: { 5 }"); 00244 00245 s3 = intersection(s1,s2); 00246 alpha("Resultat s1 intersection s2",s3); 00247 00248 00249 // ---- s1 setminus s2 ---------------------------------------------- 00250 System.out.println("Teste s1 \\ s2"); 00251 System.out.println("Erwartetes Resultat: { 1,31 }"); 00252 00253 s3 = setminus(s1,s2); 00254 alpha("Resultat s1 \\ s2 ",s3); 00255 00256 // ---- Komplement von s2 in {0..31} -------------------------------- 00257 System.out.println("Teste Complement von s2 in {0..31}"); 00258 System.out.print("Erwartetes Resultat: { 1,2,3,4,6,8,10,12,13,14,15,16,17,18,19,"); 00259 System.out.println("20,21,22,23,24,25,26,27,28,29,30,31 }"); 00260 00261 s3 = complement32(s2); 00262 alpha("Resultat complement s2 ",s3); 00263 00264 00265 }
Hier ist der Graph aller Aufrufe für diese Funktion: |
|
setminus() bildet die mengentheoretische Differenz
Die Differenz von Mengen ist definiert als
Definiert in Zeile 130 der Datei Set32.java. Wird benutzt von main(). 00130 { 00131 00132 // (~set2) invertiert alle Bits in set2 00133 // set1 & (~set2) hat daher genau diejenigen 00134 // Bits gestetzt, die in set1, aber nicht in set2 00135 // gesetzt sind. Als Mengen mittels alpha() repräsentiert, 00136 // Entspricht dies genau der mengentheoretischen Differenz 00137 return set1 & (~set2); 00138 00139 }
|
|
union() bildet die Vereinigung von 2 Mengen
Definiert in Zeile 85 der Datei Set32.java. 00085 { 00086 00087 // Das bitweise ODER setzt alle Bits, die 00088 // bereits in set1 oder set2 oder beiden 00089 // Integers gesetzt waren. Dies entspricht in 00090 // der Abstraktion unter Alpha gerade der 00091 // mengentheoretischen Vereinigung. 00092 return set1 | set2; 00093 00094 }
|