Was ist schneller?



  • wenn ich die letzte Ziffer einer Zahl haben möchte und diese nur die Werte 1-4 annehmen kann.

    Besser

    variable % 10;
    

    oder

    variable & 4;
    


  • bei %10 liegt dein Wertebereich zwischen 0 und 9.
    zwischen 1 und 4 würd ich daher mit "ifs" clampen.
    dh:

    if ( wert > 4 )
      wert = 4;
    else if ( wert < 1 )
      wert = 1;
    

    hth,
    ciao



  • Hellseher schrieb:

    wenn ich die letzte Ziffer einer Zahl haben möchte und diese nur die Werte 1-4 annehmen kann.

    ...

    variable & 4;
    

    Also dieser Code zeigt dir nur ob das 3. Bit gesetzt ist. Das willst du doch nicht? Willst du nicht eher sowas:

    variable & 0xF
    

    bzw. wenn es wirklich nur 1-4 sein kann, dann:

    variable & 0x7
    

    Zur eigentlichen Frage: Ich würde sagen, dass sich das auf "normalen" CPUs nichts schenkt. Auf kleineren µCs könnte die Variante mit Bitoperatoren durchaus schneller sein.



  • Ja logisch, meine natürlich

    variable & 0x7;
    

    es geht auch um nen kleinen uC, auf nem PC würde ich mir um sowas keinen Kopf machen 😉

    Habe mir auch schon gedacht, dass ausmaskieren schneller sein müsste.
    Leider kann ichs nicht testen, würde mich mal interessieren, wieviel % das ausmacht.



  • Hellseher schrieb:

    wenn ich die letzte Ziffer einer Zahl haben möchte

    Wie ist denn diese Zahl zu interpretieren? Dezimal? Dann nützt dir das Maskieren mit & nichts. Die einfachste Möglichkeit ist dann lediglich % 10. Das Maskieren nützt dir nur etwas, wenn du ein Zahlensystem mit einer 2-er Potenz Basis hast. Wie zB oktal (232^3) oder hexadezimal (242^4). Denn nur dann hat die Basis genau 1 Bit, worauf man % b in & (b-1) umformen kann.



  • groovemaster schrieb:

    Wie ist denn diese Zahl zu interpretieren? Dezimal? Dann nützt dir das Maskieren mit & nichts.

    Schon klar, in diesem Fall nützt das maskieren aber doch etwas, da die lezte Ziffer dieser Dezimalzahl nur die Werte 1,2,3 und 4 annehmen kann. Oder steh ich gerade völlig auf dem Schlauch? Ich denke nicht. Mit 7 maskieren sollte funzen.



  • Hah, nein, du hast natürlich recht.

    Hab nochmal drüber nachgedacht, geht nicht 😉

    ty



  • Bei der Hitze geht's mir aber auch nicht besser 🙄



  • Hast Du die Werte der letzten Ziffer unter Kontrolle? Dann könntest Du von 1..4 umsteigen auf 0..3, und dann funktioniert das Maskieren mit 0x3!
    Wenn das Ganze sehr häufig ausgeführt wird, merkt man doch einen Unterschied, die Maskierungsvariante ist schneller, auch auf "normalen" PCs. Ich muss z.B. in einer Applikation einen Index innerhalb eines Speicherbereiches halten, und mache das mit

    ptr &= TORUSMASK;
    

    Glücklicherweise ist der Speicherbereich immer eine Zweierpotenz. 😃 Gegenüber der Modulovariante ist das etwa 15% schneller.



  • Wie aber bereits erwähnt, nützt Hellseher das Maskieren nichts, sofern er die Werte dezimal interpretiert. Nur mal als Beispiel (Werte sind in dezimaler Darstellung):

    11 & 3 // == 3
    

    Was so natürlich unbrauchbar ist, da die letzte Ziffer ja eine 1 ist.



  • 🙄 Augenpaul... Hast ja Recht.


Anmelden zum Antworten