2009-05-04 4 views
12

Ich versuche, eine Funktion in Assembly zu schreiben (aber nehmen wir an, sprachunabhängig für die Frage).Wie kann ich alle Bits in einer Binärzahl unbekannter Größe auf '1' setzen?

Wie kann ich mit bitweisen Operatoren alle Bits einer übergebenen Zahl auf 1 setzen?

Ich weiß, dass ich das bitweise "oder" mit einer Maske mit den Bits, die ich setzen möchte, verwenden kann, aber ich weiß nicht, wie man eine Maske basierend auf einer Binärzahl der N-Größe baut.

+0

Würde ich den Wert der Zahl auf "-1" einstellen, wie ich will? –

+2

Hängt von der Maschinenarchitektur ab. Überprüfen Sie, wie -1 dargestellt wird. –

+3

-1, weil beide der obigen Kommentare "-1" in ihnen haben. ... scherzen. – bsneeze

Antwort

48

~ (x & 0)

x & 0 führt immer zu 0 und ~ werden alle Bits auf 1 Sekunde drehen.

+5

WTF? Warum brauchst du überhaupt x? ~ 0 ist das, worauf es ankommt, Ihre Beschreibung bezieht sich sogar darauf ("wird immer zu 0, ... führen"). – paxdiablo

+14

@Pax: vielleicht weil die Konstante 0 von irgendeinem numerischen Typ sein könnte. Einschließlich des x ergibt sich ein Kontext (und somit eine Größe oder, was noch wichtiger ist, die Anzahl der Bits), abhängig vom Compiler. –

+2

Sehr schöner Trick, um den richtigen Typ zu bekommen! +1. –

1

Setzen Sie es auf -1. Dies wird normalerweise durch alle Bits dargestellt, die 1 sind.

+3

Dies gilt für _signed_ integers in den meisten Implementierungen, die ich gesehen habe, aber um auf der sicheren Seite zu sein, würde ich wahrscheinlich die bitweise NOT-Methode benutzen, zB von Sean. – thomasrutter

+0

Sie sollten auch keine signierten Typen verwenden, wenn Sie an der internen Binärdarstellung interessiert sind. – Spookbuster

7

Setzen Sie es auf 0, dann drehen Sie alle Bits mit einem Bitwise-NOT auf 1.

1

Set x 1

Während x < Zahl x = x * 2

Antwort = Zahl oder x - 1.

Der Code setzt voraus, Ihre Eingabe "Nummer" genannt wird. Es sollte für positive Werte gut funktionieren. Hinweis für negative Werte, die zu dem Operationsversuch komplementär sind, macht keinen Sinn, da das High-Bit immer Eins ist.

+0

Das muss der leistungsmäßig optimale Weg sein –

6

Sie werden feststellen, dass Sie in Assemblersprache haben, um die Größe einer "übergebenen Zahl" zu kennen. Und in Assemblersprache ist es wirklich wichtig welche Maschine die Assemblersprache ist.

diese Informationen gegeben, könnten Sie fragen, entweder

  • Wie kann ich ein Integer-Register für alle 1-Bits gesetzt?

oder

  • Wie fülle ich einen Bereich im Speicher mit allen 1 Bits?

Um ein Register mit allen 1-Bits, auf den meisten Maschinen die effiziente Art und Weise nimmt zwei Befehle zu füllen:

  1. Deaktivieren Sie das Register, entweder mit einer speziellen Zweck klare Anweisung, oder lädt sofort 0, oder xoder das Register mit sich selbst.

  2. Nehmen Sie das bitweise Komplement des Registers.

Filling-Speicher mit 1 Bits erfordert dann 1 oder mehr Speicherbefehle ...

Sie werden viel mehr Bit-Fummel Tipps und Tricks in Hank Warrens wunderbaren Buch Hacker's Delight finden.

Verwandte Themen