bits setzen



  • Hi,

    gibt es einen Trick, wie man sehr schnell bestimmte Bits setzen kann (=1)?

    void SetBits(unsigned short Start, unsigned short End)
    {
    
      unsigned short bits = 0x0000; 
    
    }
    

    Alle Werte die sich zwischen "Start" und "End" befinden sollen jetzt in der Variable "bits" gesetzt werden; z.B. Start = 2 und End = 7
    -> bits = 0000 0000 1111 1100 sind gesetzt.

    Gruß
    HansImGlück



  • Du könntest zB 2 hoch End nehmen, und 2 hoch Start subtrahieren. Potenzen von 2 kannst du "ershiften", das sollte auf üblichen Maschinen "sehr schnell" sein.



  • int i;
    for (i = Start; i <= End; i++)
        bits |= 1 << i;
    

    Gez. monstermunchkin



  • monstermunchkin schrieb:

    int i;
    for (i = Start; i <= End; i++)
        bits |= 1 << i;
    

    Gez. monstermunchkin

    Sei N = End - Start + 1. In deinem Fall macht man N Shifts, N binäre Oder's und N Zuweisungen. In meinem Fall macht man nur zwei Shifts, gar kein Oder, und nur eine Zuweisung, dafür auch eine Addition und eine Subtraktion:

    bits = (1 << (End + 1)) - (1 << Start);  // (ungetestet)
    

    Was ist schneller?



  • µngbd schrieb:

    Was ist schneller?

    Die sind gleich schnell. Aber auf Deine Lösung wäre ich gar nicht gekommen 🙂



  • monstermunchkin schrieb:

    µngbd schrieb:

    Was ist schneller?

    Die sind gleich schnell.

    Hast du das gemessen?



  • monstermunchkin schrieb:

    Aber auf Deine Lösung wäre ich gar nicht gekommen 🙂

    Vermutlich zwei verschiedene Herangehensweisen: ich hab mir bits als Zahl gedacht, und die Zahlen-Operation "2 hoch x" am Ende als Bitshift geschrieben. Du hast dir bits wahrscheinlich als Bitfeld gedacht, und die Bitfeld-Operationen verwendet. 🙂

    monstermunchkin schrieb:

    Die sind gleich schnell.

    Ich bin mir da auch nicht so sicher...



  • _matze schrieb:

    monstermunchkin schrieb:

    µngbd schrieb:

    Was ist schneller?

    Die sind gleich schnell.

    Hast du das gemessen?

    Nein, habe ich nicht. Ich muss dazu sagen, dass sich meine obige Aussage auf Desktop-PCs bzw. Notebooks bezieht. Da gibt es nämlich keinen großen Unterschied.



  • _matze schrieb:

    Hast du das gemessen?

    wie soll das gehen? 1 mio mal aufrufen und RDTSC vergleichen ist extrem unzuverlässig bei solch kleinen codes. vielleicht disassemblierern und takte pro befehl zusammenrechnen?
    btw, µngbd's trick ist bestimmt schneller, zumindest immer gleich schnell.
    🙂


Anmelden zum Antworten