Wie klar das höchstwertige bit?
Wie ändere ich das höchstwertige bit in einem int von 1 auf 0? Zum Beispiel will ich ändern, 01101 zu 0101.
- was meinst du mit "erste 1 auf 0"?
- in string-form?
- führen logische und-operation wie 01101 & 01101 = 01101
- int mit führenden 0?
- Ich glaube, die Frage ist: "Traverse durch das integer-bit für bit. Das erste mal, wenn Sie auf eine 1 ändern Sie es, um eine null. Lassen alles andere unverändert."
- Was ist die Art Ihrer "bit-container"? int, long, string... ?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Edit: Vereinfachte (und erklärt) Antwort
Die Antwort, die ich gab unten übertrieben ist, wenn Ihr nur Ziel ist es, das höchstwertige bit auf null.
Das Letzte bit code erstellt eine bit-Maske, die alle bits der Zahl.
Hier ist die Reihe von Berechnungen führt es auf eine bestimmte 32-bit unsigned integer:
Da spielt es eine bit-Verschiebung nach rechts, die keinen wrap-around, es wird nie bits, die höher als die am meisten signifikante bit wird auf eins gesetzt. Da ist es mit einem logischen
or
Sie wird nie explizit gesetzt, werden alle Werte auf null, die nicht bereits null.Logisch, das wird immer erstellen Sie eine bit-Maske, die füllt die ganze
uint
, bis zu und einschließlich der meisten signifikante bit, die ursprünglich festgelegt wurde, aber nicht höher.Aus, dass Maske es ist ziemlich einfach, es zu verkleinern, um alle aber das höchstwertige bit, die ursprünglich festgelegt wurde:
Dann nur eine logische
and
gegen den ursprünglichen Wert, und das wird alle die meisten signifikanten bits in die Anzahl auf null, bis zu und einschließlich des höchstwertigen bit vom ursprünglichen Wert:Die ursprüngliche Zahl, die ich hier verwendet zeigt die Maske-building-Prozess gut, aber es nicht zeigen, dass die Letzte Berechnung sehr gut. Können führen Sie durch die Berechnungen mit mehr interessante Beispiel-Werte (in der Frage):
Und hier ist der Wert, den Sie suchen:
Da können wir sehen, das funktioniert, jetzt kommt der endgültige code zusammen:
(was 0101)
Ursprünglichen Antwort, die ich gab
Für diese Art von Fragen, die ich oft mit einem Verweis auf diesen Artikel:
"Bit Twiddling Hacks"
Den besonderen Abschnitt, den Sie wollen, wird als "Suche nach ganzzahligen Logarithmus zur Basis 2 einer Zahl (aka die position des höchsten bit gesetzt)".
Hier ist die erste einer Reihe von Lösungen (jeweils mehr optimal als die Vorherige):
http://graphics.stanford.edu/~seander/bithacks.html#IntegerLogObvious
Die endgültige Lösung in dem Artikel ist (konvertiert C#):
Sobald Sie gefunden haben, das höchste gesetzte bit, einfach die Maske aus:
v &= ~(1 << r);
falsch war und den Fehler verursacht, wegen signed/unsigned Fragen, und die Tatsache, dassv
verändert wird in der Mitte von der Funktion. Siehe mein edit für eine korrigierte Antwort. Ich habe die Seite überprüft, es gibt die richtige Antwort in dem Fall der OP, und Sie können den Artikel Lesen, um zu sehen, warum es mathematisch korrekt ist =PKönnten Sie etwas wie das folgende (ungetestet):
Inspiriert von Merlyn Morgan-Graham ' s Antwort
Wenn Sie als integet dann den code, ist das Ergebnis immer angezeigt werden, ohne die null.kann string-manipulation heraus, was Sie wollen, aber nicht wissen wie, die gehen, um Ihnen zu helfen. Mit string, wird so etwas wie unten:
der einfachste Weg, um bitweise Operationen wie diese, ist die Verwendung der Links-shift-operator (<<).
(1 << 3) = 100b
,(1 << 5) = 10000b
etc.dann verwenden Sie einen Wert, den Sie ändern möchten, einen bestimmten bit und verwenden
| (ODER), wenn Sie möchten, zu ändern, um eine 1 oder
& ~ (UND NICHT) wenn Sie es ändern wollen, um ein 0.
Wie diese:
(1 << 3) = 8, (1 << 5) = 32