Wie bekomme ich den Wert des niederwertigsten Bits in einer Zahl?
Lesezeit: 2 Minuten
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..: 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
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
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)
13693600cookie-checkWie bekomme ich den Wert des niederwertigsten Bits in einer Zahl?yes
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