Bitmap, wie erstellen?
-
Hi,
ich mache mich grade an die Speicherverwaltung, und habe mich für die Bitmap entschieden, aber wie kann man die erstellen? Eine Variable ist zu kurz und außerdem kann man keine Nullen hinter eine Null hängen. Was gibt es für Möglichkeiten?LG
-
Arrays.
Eine Variable ist zu kurz und außerdem kann man keine Nullen hinter eine Null hängen.
Wenn Du das meinst, was ich vermute, dann stimmt das nicht. Ein 32-bit-Wert besteht aus 32 Stellen. Immer, egal wo da eine 0 und wo da eine 1 steht. Beschäftige dich mal damit, wie so eine Zahl mit fester Breite funktioniert, und vor allem mit Bitoperationen (wirst Du für deine Bitmap ja eh brauchen).
-
Wie kann man in einer Bitmap nach einer 0 suchen? mit == und != funktioniert das nicht (was natürlich klar ist )
-
Das meine ich mit: Schau Dir Bitoperationen an. Damit geht es.
-
LightBoom schrieb:
Wie kann man in einer Bitmap nach einer 0 suchen? mit == und != funktioniert das nicht (was natürlich klar ist )
Hallo,
Wenn Du ein Bitfeld nutzen möchtest liegen alle Bit's hintereinander im Speicher.
01001011_11100001_00000000_10100000_00101111_10011111 +0 +1 +2 +3 +4 +5
Das sind 6 Byte im Speicher.
Wenn der Beginn der Bitmap z.B. bei 0x300000h liegt (3 MB) kannst du das 17. Bit so testen:mov eax, 17d ;EAX enthält die Bitposition die geprüft werden soll xor edx, edx ;EDX immer löschen vor MUL und DIV mov ebx, 8d ;17 / 8 da 8 Bit ein Byte sind div ebx ;EAX = 2 und EDX = 1 mov ecx, edx ;den Rest nach ECX kopieren für Shift-Befehl mov ebx, 0x300000h ;EBX zeigt auf Beginn der Bitmap add ebx, eax ;Wir addieren 2 Byte dazu xor eax, eax ;EAX löschen mov al, byte [ebx] ;AL = das Byte mit dem gesuchten Bit mov ah, 0x80 ;in AH setzt du Bit 7 und shiftest CL Bit nach rechts shr ah, cl test al, ah ;Nun noch testen ob das Bit gesetzt ist oder nicht jz .seite_leer ;Wenn dort eine NULL steht ist die Seite frei mov eax, -1 ;Rückgabe bei Fehler = -1 (oder NULL geht auch) wenn Bit = 1 ret .seite_leer: mov eax, 1d ;Rückgabe = 1 (True) wenn Bit 0 ret
Wenn du kein Speichermangel hast solltest du Paging verwenden, das ist nicht so schwer, nur immer umständlich beschrieben
Gruß, Nicky