Wie bekomme ich den Wert des niederwertigsten Bits in einer Zahl?

Lesezeit: 2 Minuten

Benutzer-Avatar
Riptyde4

Ich arbeite an einem Programmierprojekt und muss unter anderem eine Funktion schreiben, die eine Maske zurückgibt, die den Wert des niederwertigsten 1-Bits markiert. Irgendwelche Ideen, wie ich den Wert mit bitweisen Operatoren bestimmen kann?

ex: 
0000 0000 0000 0000 0000 0000 0110 0000 = 96
What can I do with the # 96 to turn it into:
0000 0000 0000 0000 0000 0000 0010 0000 = 32

Ich habe stundenlang meinen Kopf gegen die Wand geschlagen und versucht, das herauszufinden, jede Hilfe wäre sehr dankbar!

  • Es ist kein Duplikat. Ich habe vergessen zu erwähnen, dass es bitweise Operatoren verwenden muss

    – Riptyde4

    14. September 2013 um 21:31 Uhr

  • Kein Duplikat. Das Ziel ist nicht, die zu bekommen Index des niedrigsten Bits, sondern der Wert.

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    14. September 2013 um 21:31 Uhr

  • Entschuldigung, mein Fehler. Enge Abstimmung zurückgezogen.

    – Hochofen

    14. September 2013 um 21:36 Uhr


  • @R..: Das Abrufen des Werts aus dem Index ist trivial (1 << index).

    – chao

    14. September 2013 um 21:36 Uhr

  • Ja, aber den Wert über den Index abzurufen, ist äußerst ineffizient. Sie führen eine teure Operation durch, indem Sie es umkehren, anstatt das Problem direkt zu lösen.

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    14. September 2013 um 21:52 Uhr

x &= -x; /* clears all but the lowest bit of x */

  • Können Sie das erklären? Ich möchte verstehen, wie es funktioniert. und was ist der Unterschied zwischen der Verwendung von x & -x? und x &= -x?

    – Riptyde4

    14. September 2013 um 21:35 Uhr


  • Bei einem vorzeichenlosen Typ entspricht -x TYPE_MAX – x + 1, was ~x + 1 entspricht. Es ist einfacher zu verstehen, warum x &= ~x + 1 funktioniert.

    – Tavian Barnes

    14. September 2013 um 21:37 Uhr

  • Siehe Tavians Kommentar für die Erklärung.

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    14. September 2013 um 21:55 Uhr

  • Mod down – Frage war, die “Position” zu finden – diese Funktion gibt einfach den Wert dieses Bits zurück

    – Brad

    22. Oktober 2017 um 21:49 Uhr

  • @Brad OP gibt ein Beispiel für die beabsichtigte Ausgabe

    – MM

    13. Dezember 2017 um 3:15 Uhr

Benutzer-Avatar
Master-ID

Ein besser lesbarer Code:

int leastSignificantBit(int number)
{
    int index = 0;

    while ((~number) & 1) {
        number >>= 1;
        index++;
    }
    return 1 << index;
}

  • Der Text „ein besser lesbarer Code“ ist irreführend. Dies ist ein alternativer Ansatz, der eine teure Operation (Bitsuche, im Wesentlichen eine Art Protokoll) durchführt und sie dann invertiert, um die Antwort zu erhalten, anstatt die Antwort nur direkt zu berechnen.

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    14. September 2013 um 21:54 Uhr

  • Ich verstehe. Dies erfordert jedoch keine Kenntnis des Zweierkomplements, weshalb es “einfacher” ist. Aber ich stimme dir zu, es ist viel teurer.

    – Master-ID

    14. September 2013 um 22:01 Uhr

Benutzer-Avatar
Seth

Um sicherzugehen, dass Sie das richtige Bit/den richtigen Wert erhalten:

  • Das Wert am wenigsten signifikanten Bit Position = x & 1
  • Das Wert des isoliert niedrigstwertig 1 = x & -x
  • Die nullbasierte Index des isoliert niedrigstwertig 1 = log2(x & -x)

So sieht es in JavaScript aus:

let x = 0b1101000;

console.log(x & 1);            // 0 (the farthest-right bit)
console.log(x & -x);           // 8 (the farthest-right 1 by itself)
console.log(Math.log2(x & -x); // 3 (the zero-based index of the farthest-right 1)

1369360cookie-checkWie bekomme ich den Wert des niederwertigsten Bits in einer Zahl?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy