Tausche Bits in einer Zahl in C

9

In einem C-Interview wurde ich gebeten, die ersten 4 Bit einer Zahl mit den letzten 4 Bit zu tauschen. (z. B. 1011 1110 sollte 1110 1011 sein.)

Hat jemand dafür eine Lösung?

    
GManNickG 28.07.2009, 07:48
quelle

16 Antworten

14

Wenn Sie nicht viel gesehen oder getan haben, ist eine gute Ressource zu studieren:

ars 28.07.2009 08:29
quelle
8
%Vor%     
Ken Keenan 28.07.2009 07:54
quelle
6

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.

    
Roddy 28.07.2009 09:22
quelle
2

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.

    
Greg Hewgill 28.07.2009 07:54
quelle
2

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.

    
sharptooth 28.07.2009 07:56
quelle
2

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.

    
Johan 28.07.2009 07:52
quelle
2
%Vor%     
cpallini 28.07.2009 10:58
quelle
1

x86-Assembly:

%Vor%

Ссылка

    
Catalin DICU 28.07.2009 08:00
quelle
0

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.

    
Crippledsmurf 28.07.2009 09:22
quelle
0

Am einfachsten ist (t ist vorzeichenlos):

%Vor%

Aber wenn Sie Ihren Code verschleiern oder andere Bitkombinationen austauschen möchten, können Sie diese Basis verwenden:

%Vor%     
zxcat 24.08.2009 06:04
quelle
0
%Vor%     
Nitesh Pratap Singh 29.09.2011 19:11
quelle
0
%Vor%     
Megharaj 14.11.2013 07:16
quelle
0

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.

    
user6269400 29.04.2016 01:54
quelle
0

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%     
Guna Sekaran J 28.03.2018 05:56
quelle
0

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%     
Ashutosh Tiwari 27.05.2017 23:29
quelle
0

Suchen Sie nach etwas schlauerem als Standard-Bit-Shifting?

(angenommen a ist ein 8-Bit-Typ)

%Vor%     
Falaina 28.07.2009 07:54
quelle

Tags und Links