Es gibt keine "richtige Antwort" auf diese Art von Interviewfrage. Es gibt mehrere Möglichkeiten, dies zu tun (Nachschlagetabellen, irgendjemand?), Und die Kompromisse zwischen jedem Weg (Lesbarkeit vs. Leistung vs. Portabilität vs. Wartbarkeit) müssten diskutiert werden.
Die Frage ist nur ein Eröffnungsgambit, um Sie dazu zu bringen, einige der oben genannten Probleme zu diskutieren und festzustellen, wie "tief" Sie solche Probleme diskutieren können.
Es gibt keine Notwendigkeit für eine temporäre Variable, etwas wie das sollte es tun:
%Vor% Je nach Art des x
gibt es eine potentielle Fallstricke. Die Identifizierung dieses Problems bleibt dem Leser als Übung überlassen.
C ++ - wie Pseudocode (kann einfach umgeschrieben werden, um keine temporären Variablen zu verwenden):
%Vor%Dazu muss CHAR_BIT definiert werden. Es ist normalerweise in limits.h und wird als 8 Bits definiert, ist aber streng genommen plattformabhängig und kann in den Headern überhaupt nicht definiert werden.
Benutze einfach eine temporäre Variable und verschiebe das letzte Bit in diese Variable, dann verschiebe das Bit in diese Richtung und das Ende der Maskierung in den Bits in der tmp var und du bist fertig.
Aktualisierung: Lass uns etwas Code hinzufügen und dann kannst du auswählen, was besser lesbar ist.
Der Arbeitsliner
%Vor%der gleiche Code aber mit einigen tmp vars
%Vor%Nun, der eine Liner ist sowieso kürzer:)
Aktualisierung:
Und wenn Sie sich den Asm-Code ansehen, den gcc mit -Os -S erzeugt hat, dann ist meine Vermutung, dass sie mehr oder weniger identisch sind, da der Overhead während des Compiler-Optimierungsteils entfernt wurde.
Meine Fähigkeiten in diesem Bereich sind neu und daher noch nicht bewiesen. Wenn ich falsch liege, lerne ich etwas Neues, was zumindest ein Teil von Stack Overflow ist.
Würde eine Bitmaske und XOR auch funktionieren?
Wie so?
%Vor%Ich könnte die Dinge falsch verstehen, vergib mir, wenn ich alles vermasselt habe.
So tauschen Sie Bits komplett aus, um die Endlichkeit eines Bits in einem Byte zu ändern.
"iIn" ist eigentlich eine ganze Zahl, weil ich sie aus einer Datei lese. Ich brauche die Bits in einer Reihenfolge, in der ich sie leicht in der Reihenfolge lesen kann.
%Vor%Um nur zwei Nibbles in einem einzigen Byte zu vertauschen, ist dies der effizienteste Weg, um dies zu tun, und es ist wahrscheinlich in den meisten Situationen schneller als eine Nachschlagetabelle.
Ich sehe viele Leute, die sich verschieben und vergessen, die Maskierung hier zu machen. Dies ist ein Problem, wenn es eine Zeichenerweiterung gibt. Wenn Sie den Typ unsigned char haben, ist es in Ordnung, da es eine vorzeichenlose 8-Bit-Menge ist, aber es wird mit einem anderen Typ fehlschlagen.
Die Maske fügt keinen Overhead hinzu, mit einem Zeichen ohne Vorzeichen, die Maske ist trotzdem impliziert, und jeder ordentliche Compiler wird unnötigen Code entfernen und hat dies 20 Jahre lang.
Swap Bits ist nichts anderes als ein Um die Nibbles zu tauschen, können wir bitweise & amp; bitweise '& lt; & lt;' und "& gt; & gt;" Betreiber. Ein Byte kann unter Verwendung eines vorzeichenlosen Zeichens in C dargestellt werden, da die Größe von char 1 Byte in einem typischen C-Compiler ist. Das folgende ist C-Programm, um die zwei Nibbles in einem Byte auszutauschen.
%Vor%Lösung für generische n Bits, die zwischen dem letzten und dem ersten auswechseln. Nicht verifiziert für den Fall, dass die Gesamtbits kleiner als 2n sind. hier ist 7 für char, nimm 31 für Integer.
%Vor%Tags und Links c bit-manipulation