MSB einer Vorzeichenlosen Zahl detektieren (unsigned int)



  • Hallo zusammen,

    wie kann ich das MSB (oberste Bit) einer Vorzeichenlosen Zahl detektieren (unsigned int)? Prinzipiell geht das schon über if-Abfragen, jedoch brauche ich einen hochperformanten Code, da "embedded system" ! Ich könnte mir vorstellen das es über Maskenvariablen irgendwie geht...

    Vielen Dank, Euer Kevin



  • if(zahl & (~(~0U>>1))){
        // MSB ist gesetzt
    }
    else{
        // MSB nicht gesetzt
    }
    


  • TactX schrieb:

    if(zahl & (~(~0U>>1))){
        // MSB ist gesetzt
    }
    else{
        // MSB nicht gesetzt
    }
    

    Die erste Zeile sieht ein wenig "quick and dirty" aus. Kannst Du mir sagen was da passiert??? Viele Grüße 😮



  • Wir nehmen einen 16 Bit unsigned int an (uint16_t)

    0000 0000 0000 0000 <- 0U
    1111 1111 1111 1111 <- ~0U
    0111 1111 1111 1111 <- (~0U>>1)
    1000 0000 0000 0000 <- (~(~0U>>1))
    

    Das ist aber nicht "quick and dirty" sondern portabel. Quick and dirty wäre 0x8000.



  • TactX schrieb:

    Wir nehmen einen 16 Bit unsigned int an (uint16_t)

    0000 0000 0000 0000 <- 0U
    1111 1111 1111 1111 <- ~0U
    0111 1111 1111 1111 <- (~0U>>1)
    1000 0000 0000 0000 <- (~(~0U>>1))
    

    Das ist aber nicht "quick and dirty" sondern portabel. Quick and dirty wäre 0x8000.

    ahhhh 🙂 . Nun kann aber der Fall eintreten dass das MSB der Zahl an jeder Beliebigen Position ist : 1,2,4,8,16,....,1024 -> das muss ich abfragen... . Der Code wird Teil einer "schnellen" Histogrammanalyse. Grüße, Kevin



  • du suchst das höchste gesetzte bit?
    guckst du: http://graphics.stanford.edu/~seander/bithacks.html
    und such' mal auf der seite nach: Find the log base 2 of an integer


Anmelden zum Antworten