6 Stimmen

<html> Verschiebeoperator nach links in C </html>

Überlegen Sie:

#include 
#define macro(a) a=a<<4;

main()
{
    int a = 0x59;
    printf("%x", a);
    printf("\n");
    macro(a)
    printf("%x", a);
}

Für den obigen Code erhalte ich die unten stehende Ausgabe:

59
590

Warum erhalte ich nicht die unten stehende Ausgabe wie die linke Verschiebungsoperation?

59
90

10voto

phoeagon Punkte 2070

Linksschaltungen truncieren nicht die Nummer, um in die Länge der Originalnummer zu passen. Um 90 zu erhalten, verwenden Sie:

(a<<4) & 0xff

0x59 ist ein int und wahrscheinlich hat es auf Ihrem System sizeof(int)==4. Dann ist es ein 0x00000059. Wenn Sie es um 4 Stellen nach links verschieben, erhalten Sie 0x00000590.

Bilden Sie auch eine gute Gewohnheit, unsigned int-Typen zu verwenden, wenn Sie mit bitweisen Operatoren arbeiten, es sei denn, Sie wissen, was Sie tun. Sie haben unterschiedliches Verhalten in Situationen wie einer Rechtsschaltung.

6voto

Du hast eine hexadezimale Zahl um 4 Stellen nach links verschoben, sodass du 590 erhältst, was korrekt ist.

Du hattest

000001011001    

nach links um 4 Bits verschoben

010110010000

ist 590 in Hexadezimal

10010000

ist 90 in Hexadezimal, also möchtest du möglicherweise 0101 entfernen, wie von phoeagon gezeigt.

4voto

Barath Ravikumar Punkte 5648

In Ihrem Printf, wenn Sie %x in %d ändern, erhalten Sie a = 89.

Und nach dem Linksverschieben erhalten Sie a = 1424.

Im Allgemeinen für Dezimalzahlen (Basis 10)

a = a<< n  ist  a = a*2^n
a = a>> n  ist  a = a/2^n

Für hexadezimale (Basis 16) Zahlen kann jede Verschiebung um n (links oder rechts) als eine entsprechende Verschiebung der Ziffern des binären Äquivalents betrachtet werden. Aber das hängt von sizeof(int) ab, das für einen bestimmten Compiler verwendet wird.

1voto

Joze Punkte 1285

Sie verwenden int, also haben Sie:

 000001011001

Wenn Sie es um 4 nach links verschieben, erhalten Sie

010110010000

Wenn Sie nur die ersten 8 Bits haben möchten, brauchen Sie nicht "int" zu verwenden, sondern unsigned char (oder char):

#include

#define macro(a) a=a<<4;

main()
{
   unsigned char a=0x59;
   printf("%x",a);
   printf("\n");
   macro(a)
   printf("%x",a);
}

Wenn Sie immer noch int verwenden möchten, aber nur die ersten 8 Bits behalten möchten, können Sie eine Maske verwenden:

#define macro(a) a=(a<<4) & 0xFF

0voto

qPCR4vir Punkte 3501

Also könnten Sie mir bitte sagen, was ich tun soll, um die Ausgabe als 0x90 zu erhalten? Ich muss die letzten 4 Bits in die ersten 4 Bits verschieben und am Ende 0en hinzufügen

Der einzige Weg, um die 4 letzten Bits um 4 Bits nach links zu verschieben UND sie an die Stelle der ersten 4 Bits zu setzen, ist, wenn Ihr Typ nur 8 Bit hat. Normalerweise ist dies der Fall bei unsigned char, nicht bei int. Sie werden 0x90 erhalten für

unsigned char a=0x59;
macro(a)

aber wenn Sie int verwenden, ist das Ergebnis 0x590 Der Fehler liegt nicht in der Verwendung des <<, sondern in der Auswahl des Typs. (oder einem falschen Gebrauch des Macros?)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X