Bitweise operationen
Übersicht

PhillipKBetreff: Bitweise operationen |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 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 ![]() 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 ![]() 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 ![]() Ps: Ist mein erster 'erspielter' ansatz extrem schlecht durchdacht? Oder hats wenigstens einen fünkchen richtigkeit? *g* Gruß, Phillpk ![]() |
||
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
Statt die oberen Bits rauszuschieben, kannst du auch einfach die gewünschten Bits mit binärem And isolieren BlitzMax: [AUSKLAPPEN] zahl1:Int = 10 '1010 |
||
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 Aaah ich wusste doch, das gibts noch einfacher ![]() Muss ich dann überhaupt noch shiften? Ohne es getestet zu haben, stelle ich jetzt einfach eine vermutung auf: BlitzMax: [AUSKLAPPEN] zahl1 = bit & %1111 Hätte den selben effekt. Richtig? ![]() 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. ![]() Gruß, Phillipk |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Au backe, da war ich wohl müde. Jap, nach dem 'nachdenken' erkenne ich meinen fehler ![]() Hab im ersten moment gedacht, ich bastel mir eine neue zahl, aus allen Bits die ich mit '1' ausgewählt hab.. Nunja ![]() 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? ![]() |
||
undefined |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() Es gibt die operatoren, ~ | &.. Laut definition ist '~' ein bitweises XOR - wie nutze ich das in einer If ? oO Oder generell, wie nutz ich das ~ ![]() & 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
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ick habs ge-edited. oÔ
Manchmal hab ich einfach probleme mich auszudrücken. Grade wenn ich keine ahnung hab, was ich überhaupt will ![]() 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^^ |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group