Bit-Operationen Umschreiben

  • C#
  • .NET (FX) 1.0–2.0

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Bit-Operationen Umschreiben

    Hey Community,
    Der ein oder andere hat vllt bereits gemerkt das ich mich z.Z. brennend für Bitoperationen interessiere und damit am rumspielen bin.
    Ich wollte Fragen ob ich folgende Zweizeiler in nen Einzeiler umschreiben kann, teilweise ist das ja bei Bitoperationen möglich:

    1)

    C#-Quellcode

    1. v >>= 16;
    2. c += 16;


    2)

    C#-Quellcode

    1. v >>= 8;
    2. c += 8;


    3)

    C#-Quellcode

    1. v >>= 4;
    2. c += 4;


    4)

    C#-Quellcode

    1. v >>= 2;
    2. c += 2;



    Lg,
    Rikudo :)
    C# Developer
    Learning C++

    RushDen schrieb:

    Inwiefern hängen v und c zusammen?


    V ist ne beliebige Zahl und c enthält die Anzahl der 0 bits von rechts.
    Es geht um folgende Funktion:


    C#-Quellcode

    1. unsigned int v; // 32-bit word input to count zero bits on right
    2. unsigned int c; // c will be the number of zero bits on the right,
    3. // so if v is 1101000 (base 2), then c will be 3
    4. // NOTE: if 0 == v, then c = 31.
    5. if (v & 0x1)
    6. {
    7. // special case for odd v (assumed to happen half of the time)
    8. c = 0;
    9. }
    10. else
    11. {
    12. c = 1;
    13. if ((v & 0xffff) == 0)
    14. {
    15. v >>= 16;
    16. c += 16;
    17. }
    18. if ((v & 0xff) == 0)
    19. {
    20. v >>= 8;
    21. c += 8;
    22. }
    23. if ((v & 0xf) == 0)
    24. {
    25. v >>= 4;
    26. c += 4;
    27. }
    28. if ((v & 0x3) == 0)
    29. {
    30. v >>= 2;
    31. c += 2;
    32. }
    33. c -= v & 0x1;
    34. }
    C# Developer
    Learning C++
    Man kann, wie Erfinder des Rades, tricksen, sodass es nach weniger aussieht, aber ich denke, die minimale Anzahl Prozessoroperationen ist mit deinem Code bereits erreicht.
    Oder zumindest, wenn man diesen Ansatz verfolgt, kann natürlich sein, dass ein Algorithmus existieren könnte, der effizienter ist, der sieht dann aber schematisch anders aus.
    hihi - wesentlich kompakteren und verständlicheren Code würde man auch erhalten, wenn man einfach anners layoutet:

    C#-Quellcode

    1. if ((v & 0xffff) == 0) { v >>= 16; c += 16; }
    2. if ((v & 0xff) == 0) { v >>= 8; c += 8; }
    3. if ((v & 0xf) == 0) { v >>= 4; c += 4; }
    4. if ((v & 0x3) == 0) { v >>= 2; c += 2; }
    5. c -= v & 0x1;

    hmm - ist doch lesbarer, denn gleiches/ähnliches ist direkt untereinander angeordnet, und kann miteinander verglichen werden.
    Man erkennt sofort eine Regelmäßigkeit, und Abweichungen sprängen sehr deutlich ins Auge.

    Ich komme durch Angucken dieser Regelmäßigkeit sogar auf einen parametrisierbaren Algorithmus, Moment...

    C#-Quellcode

    1. for (var shift = 16; shift >1; shift >>= 1) {
    2. if ((v & shift - 1) == 0) { v >>= shift; c += (uint)shift; }
    3. }
    4. c -= v & 0x1;
    Da bin ich erst durch Betrachtung der kompakten Schreibweise drauf gekommen.

    Ist allerdings ungetestet - ich bin mir nicht sicher, ob das Bitshifting sich ganz so verhält, wie ich mir das denke.

    Für solche Sachen muss man eiglich Tests schreiben.


    Übrigens, die Idee, dass auch Layout Frage guten Stils ist (nicht nur Geschmacksache), und dass man Code besser versteht, wenn zusammengehöriges auch nahe beieinander steht, fand ich erstmalig in diesem lustigen Blog formuliert: joelonsoftware.com/articles/Wrong.html

    Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von „ErfinderDesRades“ ()