Höchste Binärstelle einer Zahl



  • Tja, aufwändig oder performant, du musst dich entscheiden 😉

    Wobei Wallis Weg ja nicht sonderlich kompliziert klingt.
    Ich hätte da noch etwas mit ganzzahlgerundeten-2'er-Logarithmen anzubieten, wenn dir das lieber ist... 😉

    EDIT:
    Ach Caipi hat ja auch schon gepostet, so machts keinen Spaß 😞



  • aufwändig oder performant

    ??? 🤡



  • dali schrieb:

    aufwändig oder performant

    ??? 🤡

    Umsonst ist nur der Tod, und der kost das Leben.



  • a) gute lösung: schau mal, was der assembler-befehl BSR macht. schreib eine zeile inline-asm. und gut ist's.

    b) schlechte lösung: binäre suche.

    c) katastrophische lösung:

    u32 findLastBitTrue(u32 x){
    	int result=0;
    	while(x){
    		x>>=1;
    		++result;
    	}
    	return result;
    }
    

    naja, ich verwende c).



  • @SeppSchrot: Mit Aufwand meinte ich Performance 😉 Zu faul, um eine Schleife
    zu schreiben bin ich dann doch nicht...

    Also die Lösung müsste schon _sehr_ schnell sein, sonst kann ich meinen
    Algorithmus auch mit unbekannter Anzahl an Stellen schreiben... Ich
    vermute mal log dürfte da zu unperformant sein.

    // Edit: Danke volkard 🙂



  • Nunja, die shift-Variante könnte man evtl. mit 'ner LUT (zB für 8 Bits) noch etwas beschleunigen. Ob das allerdings schneller als der Assembler Befehl ist, darf bezweifelt werden.



  • groovemaster schrieb:

    Nunja, die shift-Variante könnte man evtl. mit 'ner LUT (zB für 8 Bits) noch etwas beschleunigen. Ob das allerdings schneller als der Assembler Befehl ist, darf bezweifelt werden.

    Und was soll das bringen? ( Das mit den 8 Bits, wenn er theoretisch jedes testen müsste )



  • Habe folgendes mal irgendwo gefunden.

    int highest_bit_idx(unsigned long x) {
        if ( 0==x )  return  0;
        unsigned long r = 0;
        if ( x & 0xffff0000 )  { x >>= 16;  r += 16; }
        if ( x & 0x0000ff00 )  { x >>=  8;  r +=  8; }
        if ( x & 0x000000f0 )  { x >>=  4;  r +=  4; }
        if ( x & 0x0000000c )  { x >>=  2;  r +=  2; }
        if ( x & 0x00000002 )  {            r +=  1; }
        return r+1;
    }
    

    Kurt



  • evilissimo schrieb:

    Und was soll das bringen? ( Das mit den 8 Bits, wenn er theoretisch jedes testen müsste )

    Du hast dann zB bei 'ner 32 Bit Zahl nicht maximal 32 Tests, sondern nur 4.



  • ach egal.


Anmelden zum Antworten