frage zu bestimmtes bit setzen



  • Und bei sowas:
    0100 1000?



  • ich werd aus deiner Beschreibung nicht wirklich schlau und auch deine Beispiele sind nichtssagend, da dort nirgends das MSB geaendert wird



  • Häßlich aber schnell. Ein paar andere Algorithmen findest du hier

    static const char LogTable256[] = 
    {
      0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
      4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
      5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
      5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
      6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
      6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
      6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
      6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
      7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
      7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
      7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
      7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
      7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
      7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
      7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
      7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
    };
    
    unsigned int v = old_value; // 32-bit word to find the log of
    unsigned r;     // r will be lg(v)
    register unsigned int t, tt; // temporaries
    
    if (tt = v >> 16)
    {
      r = (t = tt >> 8) ? 24 + LogTable256[t] : 16 + LogTable256[tt];
    }
    else 
    {
      r = (t = v >> 8) ? 8 + LogTable256[t] : LogTable256[v];
    }
    
    unsigned int new_value;
    do{
      new_value = old_value | pow(2, (--r));
    while(r >= 0 && new_value == old_value);
    


  • Tachyon schrieb:

    Und bei sowas:
    0100 1000?

    wuerde 0110 1000 ergeben.

    zwutz schrieb:

    ich werd aus deiner Beschreibung nicht wirklich schlau und auch deine Beispiele sind nichtssagend, da dort nirgends das MSB geaendert wird

    soll ja auch nicht. die beschreibung welches bit gesetzt werden soll ist in der tat umgangsprachlich etwas schwierig, versuche es aber nochmal 🙂

    Finde die am weitesten links liegende Bitposition an der ein Null-Bit vorzufinden ist, jedoch links von dieser position mindestens noch eine 1 vorzufinden ist.

    ich gehe hier beispielhaft von 32-bit-zahlen aus und davon dass das zu untersuchende bitmuster zahlenmaessig keine Null ist.

    danke.



  • Fellhuhn schrieb:

    Häßlich aber schnell. Ein paar andere Algorithmen findest du hier

    static const char LogTable256[] = 
    {
      0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
      4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
      5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
      5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
      6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
      6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
      6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
      6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
      7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
      7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
      7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
      7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
      7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
      7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
      7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
      7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
    };
    
    unsigned int v = old_value; // 32-bit word to find the log of
    unsigned r;     // r will be lg(v)
    register unsigned int t, tt; // temporaries
    
    if (tt = v >> 16)
    {
      r = (t = tt >> 8) ? 24 + LogTable256[t] : 16 + LogTable256[tt];
    }
    else 
    {
      r = (t = v >> 8) ? 8 + LogTable256[t] : LogTable256[v];
    }
    
    unsigned int new_value;
    do{
      new_value = old_value | pow(2, (--r));
    while(r >= 0 && new_value == old_value);
    

    UPS, ... ähm, ist natuerlich schoen, wenn obiges tatsaechlich das macht was ich beschrieben habe (und das vielleicht noch schnell??). Vorraussetzung hierfuer ist jedoch das Du mein Problem verstanden hast (oder ich es ausreichend hervorbringen konnte) -> macht obiges wirklich das, was ich will?!?

    danke.
    gruss.



  • Sollte.

    EDIT:

    Im Grunde rechnet er dort log_2(value) und geht dann schrittweise die bits zurück um zu schauen ob sich noch eine 0 weiter rechts finden läßt und setzt die dann.



  • jetzt blick ich durch... mich hat dein Hinweis auf das MSB irritiert, da das wirklich _nur_ das MOST Signigficant Bit bezeichnet und danach ja logischerweise nichts mehr kommen kann

    was ist aber bei 0000 0001?



  • zwutz schrieb:

    jetzt blick ich durch... mich hat dein Hinweis auf das MSB irritiert, da das wirklich _nur_ das MOST Signigficant Bit bezeichnet und danach ja logischerweise nichts mehr kommen kann
    was ist aber bei 0000 0001?

    stimmt ist ein sonderfall, ich wuerd sagen dass ding bleibt unveraendert
    danke.



  • [quote="pepe75"]
    UPS, ... ähm, ist natuerlich schoen, wenn obiges tatsaechlich das macht was ich beschrieben habe (und das vielleicht noch schnell??). Vorraussetzung hierfuer ist jedoch das Du mein Problem verstanden hast (oder ich es ausreichend hervorbringen konnte) -> macht obiges wirklich das, was ich will?!?
    /quote]

    Wenn ich das hier so schön serviert bekäme, würde ich es einfach ausprobieren, und mich melden, wenn es nicht so funktionieren würde, wie ich wollte ...


  • Mod

    Fellhuhn schrieb:

    Sollte.

    EDIT:

    Im Grunde rechnet er dort log_2(value) und geht dann schrittweise die bits zurück um zu schauen ob sich noch eine 0 weiter rechts finden läßt und setzt die dann.

    pow(2, foo ?
    warum enthält die LUT nicht gleich die gesuchte Bitstelle?

    template <unsigned v>
    struct strange_bit_scan
    {
        static const int value = v % 2 == 0 || strange_bit_scan< v / 2 >::value != -1 ? 1 + strange_bit_scan< v / 2 >::value : -1;
    };
    
    template <>
    struct strange_bit_scan< 0 >
    {
        static const int value = -1;
    };
    

    kann man trivial zum generieren einer LUT benutzen.


Anmelden zum Antworten