In diesem Artikel, der in erster Linie GML-Anfängern gewidmet ist, will ich den Umgang mit binären Zahlen erläutern. Diese richtig zu verwenden kann sehr nützlich sein und einiges an z.B. benötigtem Arbeitspeicher oder auch an Programmieraufwand einsparen.
Erst einmal ist eine binäre Zahl nur eine Zahl anders dargestellt, nämlich als eine Reihe von "Bits", wobei jedes Bit nichts anderes ist als eine Bool'sche Variable (true oder false).
Sehen wir uns mal folgendes Beispiel an: Eine Spielwelt besteht aus Spielfeldern verschiedenen Typs: Grasland, Wald, Berge oder Wasser. Man hat also für jedes Spielfeld eine Zahl, die den Typ angibt - z.B. so
Diese Zuordnung geht spätestens dann in die Hose, wenn ein Spielfeld Wald und Berge haben soll. Deshalb benutze ich an dieser Stelle folgende Zahlenwerte:
Diese Zahlen (auch Zweierpotenzen genannt) haben den großen Vorteil, daß sie den einzelnen Bits einer Binärzahl entsprechen. Ich kann also jedes Bit einzeln "setzten" oder "löschen", indem ich schreibe:
Man kann natürlich binäre Zahlen mit Dezimalzahlern mischen, also z.B. die untersten vier Bits (dezimal 0-15) stehen für Terrain-Höhe und Bits 4-7 für den Terrain-Typ.
Bitweise Operationen
Diese normale Addition
funktioniert natürlich nur, wenn der Wert für Wald nicht schon in der Zahl enthalten ist. Ebenso würde zu falschen Ergebnissen führen, wenn der Wert NICHT enthalten wäre. Also wird eine andere Methode benutzt, um einzelen Bits zu setzten, zu löschen und vor allem zu LESEN - denn wir wollen ja genau wissen, welche Bits gesetzt sind und welche nicht.
Um also einelne Bits zu setzen, schreibt man normalerweise (z.B. für Bit2):
Anmerkung: Ich würde an dieser Stelle tatsächlich "4" schreiben für Bit2 und nicht "power(2,2)" oder so. Ist einfach schneller.
Will ich das Bit2 löschen, benutze ich xor:
Zum Auslesen der einzelnen Bits nimmt man schließlich
Jetzt kommt aber das interessanteste: Der Computer liebt es, mit einzelnen Bits zu rechnen. Soll heißen, bitweise Operationen (and, or, xor) gehen extrem schnell, weil das die reine Maschinensprache ist. (Kann sein, daß ich mich beim Game Maker jetzt irre, denn ich weiß nicht genau wie der GML-code nach dem Kompilieren aussieht)
Wer diese Operationen nicht kennt und deren vielfältige Anwendungsmöglichkeiten zu schätzen weiß, dem schlage ich vor, einfach mal bei Wikkipedia nachzulesen oder nach Bool'schen Operationen zu googeln.
Man kann zum Beispiel alle Bits einer Speicherstelle umkehren, verschieben oder einzelne Bits "rausfiltern" - ich kann sagen: gib mir nur die Bits 0-3 aus, der Rest interessiert mich jetzt gerade nicht. Oder, was ich oft benutze, ist Schalter "umschalten" mit anstelle von
Erst einmal ist eine binäre Zahl nur eine Zahl anders dargestellt, nämlich als eine Reihe von "Bits", wobei jedes Bit nichts anderes ist als eine Bool'sche Variable (true oder false).
Sehen wir uns mal folgendes Beispiel an: Eine Spielwelt besteht aus Spielfeldern verschiedenen Typs: Grasland, Wald, Berge oder Wasser. Man hat also für jedes Spielfeld eine Zahl, die den Typ angibt - z.B. so
Diese Zuordnung geht spätestens dann in die Hose, wenn ein Spielfeld Wald und Berge haben soll. Deshalb benutze ich an dieser Stelle folgende Zahlenwerte:
Diese Zahlen (auch Zweierpotenzen genannt) haben den großen Vorteil, daß sie den einzelnen Bits einer Binärzahl entsprechen. Ich kann also jedes Bit einzeln "setzten" oder "löschen", indem ich schreibe:
Man kann natürlich binäre Zahlen mit Dezimalzahlern mischen, also z.B. die untersten vier Bits (dezimal 0-15) stehen für Terrain-Höhe und Bits 4-7 für den Terrain-Typ.
Bitweise Operationen
Diese normale Addition
funktioniert natürlich nur, wenn der Wert für Wald nicht schon in der Zahl enthalten ist. Ebenso würde zu falschen Ergebnissen führen, wenn der Wert NICHT enthalten wäre. Also wird eine andere Methode benutzt, um einzelen Bits zu setzten, zu löschen und vor allem zu LESEN - denn wir wollen ja genau wissen, welche Bits gesetzt sind und welche nicht.
Um also einelne Bits zu setzen, schreibt man normalerweise (z.B. für Bit2):
Anmerkung: Ich würde an dieser Stelle tatsächlich "4" schreiben für Bit2 und nicht "power(2,2)" oder so. Ist einfach schneller.
Will ich das Bit2 löschen, benutze ich xor:
Zum Auslesen der einzelnen Bits nimmt man schließlich
Jetzt kommt aber das interessanteste: Der Computer liebt es, mit einzelnen Bits zu rechnen. Soll heißen, bitweise Operationen (and, or, xor) gehen extrem schnell, weil das die reine Maschinensprache ist. (Kann sein, daß ich mich beim Game Maker jetzt irre, denn ich weiß nicht genau wie der GML-code nach dem Kompilieren aussieht)
Wer diese Operationen nicht kennt und deren vielfältige Anwendungsmöglichkeiten zu schätzen weiß, dem schlage ich vor, einfach mal bei Wikkipedia nachzulesen oder nach Bool'schen Operationen zu googeln.
Man kann zum Beispiel alle Bits einer Speicherstelle umkehren, verschieben oder einzelne Bits "rausfiltern" - ich kann sagen: gib mir nur die Bits 0-3 aus, der Rest interessiert mich jetzt gerade nicht. Oder, was ich oft benutze, ist Schalter "umschalten" mit anstelle von
Dieser Beitrag wurde bereits 10 mal editiert, zuletzt von Melancor ()