Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

10.12.2005, 18:38

Bitoperatoren umrechnen

hi,

ich hab mal eine frage: ist es möglich die Berechnungen die Bitoperatoren bewirken mit einem Blick zu erkennen?

Zum Beispiel verschieben >> und << eine Variable um die angegebene Zahl an Bits nach rechts/links. Wenn man aber weiß dass es sich hierbei um ne multiplikation/division mit/druch 2 hoch der angegebenen zahl handelt ist man in sekundenschnelle beim ergebnis.

funktioniert das auch mit den anderen bitoperatoren (&, |, ~, etc.) oder muss ich weiterhin rumrechnen wie ein bekloppter :D

Steven77

Alter Hase

Beiträge: 515

Wohnort: Münster - Gievenbeach

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

10.12.2005, 19:24

Was genau willst Du denn ausrechnen?

Anonymous

unregistriert

3

10.12.2005, 22:25

Sk!p
Wie Steven77 schon sagte: Kommt drauf an WAS Du machen willst!

z.B. Testen ob eine Zahl gerade oder Ungerade ist. Viele gehen da mit Divisionen, castings oder sogar Modulo dran!

Dabei ist es so easy:

C-/C++-Quelltext

1
2
3
4
5
        // Testet ob die Zahl gerade oder Ungerade ist.

    template<typename T> inline const bool isEven (const T& value)
    {
        return (!(value&1));
    }


Sag uns was Du möchtest und ggf. können wir da was regeln ;)

edit: Welcher Typ hatte diese Schnappsidee mit den kursiven Kommentanren? Man das sieht so ekelhaft aus und ist so uneleserlich. Ne richtige zumutung!

4

11.12.2005, 11:25

naja das mit dem testen auf grade oder ungrade ist ja auch die einfachste version ^^

aber ich habe hier zum beispiel den quelltext zum rendern eines einfachen levels durch das man nur durchfliegen kann. Wenn die Faces jetzt gerendert werden wird für jedes Face ein Bitslot gesetzt der aussagt ob das Face scho gerendert wurde oder nicht.

Diese Funktion setzt den Slot:

C-/C++-Quelltext

1
2
3
4
void Set(int i)
    {
        m_Bits[i >> 5] |= (1 << (i & 31));
    }


Diese testet auf 0 oder 1

C-/C++-Quelltext

1
2
3
4
int On(int i)
    {
        return m_Bits[i >> 5] & (1 << (i & 31));
    }


da kann ich beim rechten teil schonmal 2 DIN A-4 seiten vollschreiben bis ich weiß was das heißt ^^

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

5

11.12.2005, 12:31

Zitat von »"nix da"«

Welcher Typ hatte diese Schnappsidee mit den kursiven Kommentanren? Man das sieht so ekelhaft aus und ist so uneleserlich. Ne richtige zumutung!

Sonst geht's aber noch?

Anonymous

unregistriert

6

11.12.2005, 13:05

David Scherfgen
Ich sag was ich denke und ich sag wie ich empfinde. Das solltest Du doch wissen ;)

Du weißt doch: Bei mir gibt es nur Klartext, da ich dieses ewige "Drum und Dran" nur als hmn wie soll ich sagen? "Zeitaufwendig" ansehe was der Produktivität erheblich nicht zu Gute kommt ;)

Steven77

Alter Hase

Beiträge: 515

Wohnort: Münster - Gievenbeach

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

7

11.12.2005, 14:05

Zitat von »"sk!p"«

da kann ich beim rechten teil schonmal 2 DIN A-4 seiten vollschreiben bis ich weiß was das heißt ^^

Was verstehst Du an dem Code denn nicht? Und, wer hat den geschrieben, dass Du den Code benutzt?
Es wird der passende Array-Index ermittelt, indem durch 32 geteilt bzw. mit 5 geshiftet wird (32-Bit). Dann wird die entsprechende Bit-Position (Module 32 bzw. & 31) auf 1 gesetzt bzw. getestet.
Habe ich jetzt nur zusammengefasst, was Du sowieso schon weisst? Dann verstehe ich allerdings das Problem nicht...

8

11.12.2005, 15:34

naja ich verstehe irgendwie nur oberflächlich was das bewirkt. okay das shiften ist klar aber wieso werden nur die bits einer 31 gesetzt?

31 ist ja binär das: 0000 1111

also wieso werden die vorderen bits ausmaskiert? und wo wird hier durch 32 geteilt? ???

und was das |= am ende bewirkt kann ich auch nicht so ganz nachvollziehen

aber meine eigentlich frage war, sagen wir ich habe folgenden ausdruck

123 & 83

kann ich den irgendwie auf die schnelle berechnen oder muss ich mir erst beide zahlen binär aufmalen um zu sehen was passiert?

Lemming

Alter Hase

Beiträge: 550

Beruf: Schüler

  • Private Nachricht senden

9

11.12.2005, 15:42

kannst dir doch nen binär taschenrechner schreiben...
Es gibt Probleme, die kann man nicht lösen.
Für alles andere gibt es C++...

Steven77

Alter Hase

Beiträge: 515

Wohnort: Münster - Gievenbeach

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

10

11.12.2005, 17:22

Den Binärtaschenrechner musst Du Dir nicht unbedingt selbst schreiben, den gibts bei Windows dabei: Start->Programme->Zubehör->Rechner, Ansicht->Wissenschaftlich.

Ein Shift um 5 Positionen nach rechts kommt einer Division durch 32 gleich.
Es wird quasi durch 32 geteilt, weil das Array offensichtlich aus 32-Bit-Variablen aufgebaut ist (Bit Nummer 1000 liegt im Array also an Stelle 31). Genau deshalb wird ja auch Modulo 32 gerechnet (% 32 ist das gleiche wie & 31), weil Du ja innerhalb einer 32-Bit-Variablen die höheren Bits wegschneiden musst, die beim Index bereits berücksichtigt wurden (Bit Nummer 1000 entspricht dann im 31. Array-Feld dem 8. Bit).

Mit dem |= setzt Du das entsprechende Bit, sofern es nicht schon gesetzt ist.
Testen, ob ein Bit gesetzt ist, kannst Du mit einer &-Operation.

Ups, mir ist gerade aufgefallen, dass der Windows-Rechner keine Shift-Operationen unterstützt, nur And, Or, etc.

Werbeanzeige