Bitweise operationen

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

PhillipK

Betreff: Bitweise operationen

BeitragDo, Okt 28, 2010 4:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Community!

Wiedereinmal eine kleine 'beginner' frage von mir.
Ich ziehe in erwägung, werte in meinem Projekt gesammelt zu speichern.

Zb
10 und 15 in eine zahl, als bits gespeichert.

Da ich noch keine wirkliche ahnung habe, wie bitweise operationen funktionieren (nur grundlegendes binärwissen aus dem Informatikunttericht vor.. puh, 5 jahren?), habe ich ein wenig rumgespielt.

Hier eine erste idee, zahlen zusammen in einer abzuspeichern und wieder auszulesen:
BlitzMax: [AUSKLAPPEN]
zahl1:Int = 10 '1010
zahl2:Int = 15 Shl 4 '1111
zahl3:Int = 5 Shl 8 '0101

bit:Int = zahl1+zahl2+zahl3

Print Bin(bit)

zahl1 = (bit Shl 28) Shr 28
zahl2 = (bit Shl 24) Shr 28
zahl3 = (bit Shl 20) Shr 28

Print zahl1
Print zahl2
Print zahl3


Wie man vielleicht erkennt, wäre mein erster ansatz, zahlen per ShiftLeft zu verschieben, an die binärstelle die ich gerne hätte. dann werden sie ganz stumpf addiert.
Wäre für mich die einzige idee, wie ich die als bits zusammenaddiere.

Danach möchte ich gerne die zahlen wiederhaben. Das wird mein problem Very Happy

Mein einziger ansatz hierzu wäre, das ich die 4 bits die 'isolieren' möchte, erst rausschiebe (ShiftLeft 28 um die ersten 4 bits zu erhalten) und danach um 28 bits zurück nach rechts schiebe. Das ganze mache ich mit allen zahlen, jeweiles um 28 zurück, damit sie vorne stehen (hinten^^).

Das klappt auch ganz gut, ich finde es nur ziemlich schlampig.
Meine vermutung ist, das ich das über operatoren sauberer (schneller?) gestalten könnte.
Aber wie genau ich die anwende.. puuuh^^ Nur durchs rumspielen wird das ewig dauern, bis ichs genau verstehe.

Wichtig ist mir, das ich nur die stelle kenne (bit 1->4, bit 5->9 etc) und nicht den wert. Dh ich möchte einzelne Bits isolieren und wieder als richtige zahl erhalten.
Der zweite punkt ist der speedfaktor.
Ich meine mich grob erinnern zu können, das in BlitzMax bitweise operationen extrem schnell sein sollen. Stimmt das?
Lohnt es, werte zusammen zu fassen, um ram zu sparen (ich habe sehr,sehr viele werte, die ich speicherarm speichern möchte, da das neu errechnen leichte CPU laggs verursacht, aber ich locker mal auf 10mb pro kartenabschnitt kommen kann, geht um vertex positionen etc)

Bitte, macht euch nicht zuviel mühe, mir das haarklein zu erklären Very Happy Ein paar suchvorschläge zu tutorials (blitzmax bezogen :/ ) würden schon reichen.
Oder falls es dafür sogar eine Funktion in BlitzMax gibt, einfach schreiben. Ich werde eh noch rumspielen müssen, bis ich das halbwegs verstehe Very Happy

Ps: Ist mein erster 'erspielter' ansatz extrem schlecht durchdacht? Oder hats wenigstens einen fünkchen richtigkeit? *g*

Gruß, Phillpk Smile

Noobody

BeitragDo, Okt 28, 2010 6:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Statt die oberen Bits rauszuschieben, kannst du auch einfach die gewünschten Bits mit binärem And isolieren BlitzMax: [AUSKLAPPEN]
zahl1:Int = 10 '1010
zahl2:Int = 15 Shl 4 '1111
zahl3:Int = 5 Shl 8 '0101

bit:Int = zahl1 | zahl2 | zahl3 'In solchen Fällen is binäres Or schneller als Addition, da Or keinen Überlauf behandeln muss

Print Bin(bit)

zahl1 = bit & %1111
zahl2 = (bit Shr 4) & %1111
zahl3 = (bit Shr 8) & %1111

Print zahl1
Print zahl2
Print zahl3
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun
 

PhillipK

BeitragDo, Okt 28, 2010 6:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Noobody hat Folgendes geschrieben:
Statt die oberen Bits rauszuschieben, kannst du auch einfach die gewünschten Bits mit binärem And isolieren BlitzMax: [AUSKLAPPEN]
zahl1:Int = 10 '1010
zahl2:Int = 15 Shl 4 '1111
zahl3:Int = 5 Shl 8 '0101

bit:Int = zahl1 | zahl2 | zahl3 'In solchen Fällen is binäres Or schneller als Addition, da Or keinen Überlauf behandeln muss

Print Bin(bit)

zahl1 = bit & %1111
zahl2 = (bit Shr 4) & %1111
zahl3 = (bit Shr 8) & %1111

Print zahl1
Print zahl2
Print zahl3


Aaah ich wusste doch, das gibts noch einfacher Very Happy
Muss ich dann überhaupt noch shiften?

Ohne es getestet zu haben, stelle ich jetzt einfach eine vermutung auf:

BlitzMax: [AUSKLAPPEN]
zahl1 = bit & %1111
zahl2 = bit & %11110000
zahl3 = bit & %111100000000


Hätte den selben effekt. Richtig? Smile

Danke für die antwort, das war schonmal etwas in die richtung wie ich es gesucht hab.
Bleibt nurnoch die frage, ob es deutlich merkbar wird, wenn ich zirka 32.000*7 werte in 3-4'ren zusammenfasse und sie nacher wieder auslese. Smile

Gruß, Phillipk

BladeRunner

Moderator

BeitragDo, Okt 28, 2010 11:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Hätte es nicht, da sie immer noch an "höheren" Positionen gespeichert sind:
1010 1100 (172, hier aber 10 und 12 einzeln gespeichert)
&1111 0000 (die linken Bits werden markiert)
__________
1010 0000 -> 160 (UUPS!)

erst mit
1010 0000 shr 4 wird
0000 1010 (10) draus Wink

EDIT: Wenn Du aber den Zahlenbereich den Du speichern möchtest schon kennst und er zB im Bereich eines Byte liegt kannst Du auch gleich deine Variable als :byte deklarieren.
Zudem sind solche 'Optimierungen' in den allermeisten Fällen nicht wirklich sinnvoll. Braucht der konkrete Fall denn eine derart komprimierte Datenspeicherung?
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

PhillipK

BeitragDo, Okt 28, 2010 12:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Au backe, da war ich wohl müde. Jap, nach dem 'nachdenken' erkenne ich meinen fehler Very Happy
Hab im ersten moment gedacht, ich bastel mir eine neue zahl, aus allen Bits die ich mit '1' ausgewählt hab.. Nunja Smile

Es ist kein speziller fall, der es umbedingt von nöten macht..
Es geht um die TSurface in minib3d.
Da es zu speicherlastig ist, nen haufen Surfaces zu erstellen, bastel ich ein wenig rum, mehrere objekte auf einer zusammen zu fassen.
Eine meiner ideen die sich aufgrund der mangelnden Manipulationsmöglichkeit (sie besteht immernoch! und schaut nicht allzu fps lastig aus *g*) wäre ein zusammenfassen mehrerer Vertexgruppen in speziellen types.
Da ich aber für jede einzelne koordinate etc einen Wert brauche, überlege ich mir, wie ich das speicher armer ablegen könnte.

Ausserdem intressieren mich Bitweise operationen schon länger, jedesmal wenn es früher 'Bitweise arbeiten' hieß, dachte ich mir nur 'oh oh.. und tschüss' *g*
Habe mich also nie wirklich damit befasst.

Wie genau funktioniert bitweise Or und Xor? Smile
 

undefined

BeitragDo, Okt 28, 2010 13:00
Antworten mit Zitat
Benutzer-Profile anzeigen
    OR: 0|0 = 0, 1|0 = 1, 0|1 = 1, 1|1 = 1
    XOR: 0|0 = 0, 1|0 = 1, 0|1 = 1, 1|1 = 0

XOR (exclusive-or) ist quasi ein "wenn das oder das, aber nicht beides!"
 

PhillipK

BeitragDo, Okt 28, 2010 14:46
Antworten mit Zitat
Benutzer-Profile anzeigen
also wenn ich jetzt..

zahl1:Int = 10 '1010
zahl2:Int = 5 '0101

'''If zahl1~zahl2 Then Print "Dieser fall wird eintreten"
^- schwachsinn, wie ich grade durchdenke. bitte ignorieren ^^
?

Also eine xor operation auf bitebene.. aber hää ^^

XOR kann ich wie And und Or verwenden.. aber mit den operatoren (~) ? oÔ

---

edit: okay deutlicher Smile

Es gibt die operatoren, ~ | &..
Laut definition ist '~' ein bitweises XOR - wie nutze ich das in einer If ? oO Oder generell, wie nutz ich das ~ Smile
& und | habe ich glaube ich mal irwo als beispiel gehabt, ~ ergibt sich mir allerdings nicht...
setzt es die bits, die verglichen werden, auf 1, wenn es unterschiede sind? ehm... weiß nicht wie ich es formulieren soll..

1010 ~ 0101 = 1111 ?
1100 ~ 1010 = 0110 ? ... Wäre das einzige was ich mir vorstellen kann.
Leider habe ich grade kein Blitzmax in der nähe, wo ich dies austesten könnte :/
  • Zuletzt bearbeitet von PhillipK am Do, Okt 28, 2010 14:57, insgesamt 2-mal bearbeitet

BladeRunner

Moderator

BeitragDo, Okt 28, 2010 14:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Könntest Du deine Frage ein wenig deutlicher formulieren? Ich hab keinen Schimmer was Du meinst?
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

PhillipK

BeitragDo, Okt 28, 2010 16:28
Antworten mit Zitat
Benutzer-Profile anzeigen
ick habs ge-edited. oÔ
Manchmal hab ich einfach probleme mich auszudrücken. Grade wenn ich keine ahnung hab, was ich überhaupt will Very Happy

Hintergrundwissen erarbeiten ist nicht so ganz einfach :-/ hab zwar schon dutzende zeilen ins programm gescchrieben, aber noch nie eine Tmap genutzt und nie bitweise gearbeitet.. mh^^

BladeRunner

Moderator

BeitragDo, Okt 28, 2010 20:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Bitweise Operatoren verändern das Ziel direkt und können anders als logische Operatoren nur begrenzt für boolsche Logik eingesetzt werden.

Beispiel:
if a=3 AND b=4 then ... : Dieses AND ist ein boolscher Operator und hier müssen die beiden Teilbedingungen wahr sein, damit der Gesamtausdruck Wahr (also 1) wird.

if a&15 then ...: hier ist das & ein binärer Operator, d.h. jedes a was nach dem binären Zugriff ungleich 0 bleibt wird als wahr gewertet.
Da 15 = %1111 wird also das if z.B für alle werte von 1-15 wahr, für 16 nicht, für 17-31 wieder wahr...

Du kannst also binäre Operatoren durchaus für Entscheidungen nutzen, musst allerdings ihre Eigenheiten beachten.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group