Ok...
Dirty Oerti hat geschrieben:Hm...heißt es nicht "Bitoperatoren" ?
Das sollte einen Hauch von Sarkasmus mit sich bringen
Xin hat geschrieben:Deine Annahme, wie es funktioniert ist vollkommen richtig.
Ist mir bewusst.
Xin hat geschrieben:Nein. Es multipliziert countb mit 32.
Meinte ich, tschuldigung
Ich versuche es mal an einem anderen Beispiel zu erklären:
Ein Array.
Ein 2 Dimensionaler Array.
Sagen wir von der Größe [5][3].
Heißt wir haben 5 mal einen Block von 3 Werten.
Nehmen wir an, Wert = Bit.
Nun suchen wir ein Bit/einen Wert gleich 0.
Dazu überprüfen wir zunächst den ersten "3-Werte-Block", stellen fest, dass dort alle Wert ungleich 0 sind
(im echten Code ist das EIN Vergleich, da alle 3 Werte, bzw im Code eben 32 (Bit), auf einmal angesprochen werden können)
Heißt wir überprüfen den nächsten Block.
Sagen wir, der 4. Wert in diesem 2. Block ist gleich 0.
Nun haben wir unseren gesuchten Wert gefunden.
Jetzt nehmen wir an, wir möchten diesen Wert adressieren.
Nur eben nicht per [1][3] (2. Block, 4.Wert)
Sondern mit einer Zahl.
Wie machen wir das?
Nunja:
(ANZAHL ELEMENTE PRO BLOCK * Block) + Wert
Im Beispiel also (5*1)+3 = 8
Im Code oben sind es nunmal 32 Bits und nicht 5 Werte.
Deswegen nehme ich die Nummer des Blocks (countb) mit der Anzahl der Werte/Bits pro Block mal.
Damit bekomme ich eine einzelne Nummer, mit der ich dann das Bit (das für einen Frame steht) eindeutig adressieren kann.
Ok?
Xin hat geschrieben:Die Operation ist ungewöhnlich, daher vermute(!) ich, dass sie nicht die ist, die Du tun willst. Ich kenne aber auch nur Codefragmente.
Es ist genau die Operation, die ich tun möchte
Der ganze Code ist hier zu finden:
http://proggen.org/viewtopic.php?p=2606#p2606
Es ist die Funktion find_first_free()
Sie durchsucht eine Bitmap in 32Bit-Schritten (liest immer 32 Bit und prüft, ob alle gesetzt)
Wenn sie einen 32Bit-Block findet, in dem nicht alle Bits gesetzt sind, werden noch die einzelnen Bits überprüft, um herauszufinden, welches Bit denn nun nicht gesetzt ist.
Dann Nr. des 32-Bit-Blocks*32 + Nr des Bits im Block ergibt absoulute Bitnummer.
Die wiederrum steht in dem speziellen Fall für die Nummer der (Unter)Bitmap.
Diese wird daraufhin genauso wie oben durchsucht.
Das hier gefundene, freie Bit bezeichnet dann aber die Nummer des Frames in der (Unter)Bitmap.
Um die absolute Nummer zu erhalten nehme ich die Nr der (Unter)Bitmap mal der Anzahl Frames in einer Bitmap plus die Nummer des Frames in der Bitmap.
Und schon habe ich die absolute Framenummer.