Heim  >  Artikel  >  Wie man die Linksverschiebungs- und Rechtsverschiebungsoperatoren in der C-Sprache versteht

Wie man die Linksverschiebungs- und Rechtsverschiebungsoperatoren in der C-Sprache versteht

清浅
清浅Original
2019-03-11 17:28:2256348Durchsuche

Die Linksverschiebung in der C-Sprache stellt den Linksverschiebungsoperator dar, was bedeutet, dass das höchste Bit verworfen und das niedrigste Bit mit 0 gefüllt wird, während die Rechtsverschiebung in der C-Sprache der Rechtsverschiebungsalgorithmus ist, der das Gegenteil der Linksverschiebung ist . Es verschiebt sich ein paar Stellen nach rechts.

Wie man die Linksverschiebungs- und Rechtsverschiebungsoperatoren in der C-Sprache versteht

Verwendung von Linksverschiebungs- und Rechtsverschiebungsoperatoren in der C-Sprache: Der Linksverschiebungsoperator verwirft das höchste Bit und fügt 0 zum niedrigsten Bit hinzu. Rechtsverschiebung Der Algorithmus ist Das Gegenteil von Linksverschiebung besteht darin, ein paar Bits nach rechts zu verschieben

Die Linksverschiebungs- und Rechtsverschiebungsoperatoren in der C-Sprache sind Operatoren in der C-Sprache und werden im Artikel „Anleitung“ ausführlich vorgestellt Die Verwendung dieser beiden Operatoren hat einen gewissen Referenzwert. Ich hoffe, dass sie für alle hilfreich sind >】

Lassen Sie uns zunächst über die Linksverschiebung sprechen. Bei der Linksverschiebung werden alle Bits einer Zahl um eine bestimmte Anzahl von Stellen nach links verschoben. Zum Beispiel:

int i = 1;
i = i << 2;  //把i里的值左移2位
Mit anderen Worten, die binäre Darstellung von 1 ist 000...0001 (die Anzahl der Nullen vor 1 hängt hier mit der Anzahl der Ziffern in int zusammen. Auf a 32-Bit-Maschine, es gibt 31 in gcc 0), nachdem es um 2 Bits nach links verschoben wurde, wird es 000 ... 0100, was 4 in der Dezimalzahl ist. Daher entspricht das Verschieben von 1 Bit nach links einer Multiplikation mit 2. dann ist das Verschieben von n Bits nach links eine Multiplikation mit 2 hoch n. (Vorzeichenbehaftete Zahlen sind nicht vollständig anwendbar, da die Verschiebung nach links dazu führen kann, dass sich das Vorzeichen ändert. Der Grund wird unten erklärt) Ein Problem, das Aufmerksamkeit erfordert ist, dass das Vorzeichenbit des m-Endes nicht auf dem Bus ganz links vom Typ int gemeldet wird und die Verschiebung nach außen verschoben wird. Wir wissen, dass int eine vorzeichenbehaftete Ganzzahl ist und das ganz linke 1-Bit das Vorzeichenbit ist, das heißt. 0 positiv und 1 negativ. Dann tritt beim Verschieben ein Überlauf auf, zum Beispiel:
int i = 0x40000000; //16进制的40000000,为2进制的01000000...0000
i = i << 1;
Dann, nachdem ich um 1 Bit nach links verschoben wurde, wird es 0x80000000, was 100000 ist... 0000 im Binärformat ist auf 1 gesetzt und die anderen Bits sind alle 0, was der Mindestwert ist, den der int-Typ darstellen kann. Der Wert von 32-Bit int ist -2147483648, was passiert, wenn i wird dann um 1 Bit nach links verschoben? In der C-Sprache wird das höchste Bit verworfen. Nach dem Verwerfen von 1 wird der Wert von i zu 0.

Ein Sonderfall bei der Linksverschiebung ist, dass die Anzahl der Ziffern verschoben wird Wenn links die maximale Anzahl von Ziffern des numerischen Typs überschreitet, verwendet der Compiler die Anzahl der nach links verschobenen Ziffern, um die maximale Anzahl von Ziffern des Typs zu modulieren, und verschiebt sie dann um den Rest, z. B.:


int i = 1, j = 0x80000000; //设int为32位
i = i << 33;   // 33 % 32 = 1 左移1位,i变成2
j = j << 33;   // 33 % 32 = 1 左移1位,j变成0,最高位被丢弃

Beim Kompilieren dieses Programms mit gcc gibt der Compiler eine Warnung aus, die besagt, dass die Anzahl der Linksverschiebungen >= Typlänge ist. Dann werden i und j tatsächlich um 1 Bit verschoben, was dem Rest nach 33 entspricht %32. Dies ist die Regel unter

gcc. Es ist nicht klar, ob andere Compiler gleich sind.

Kurz gesagt, die Linksverschiebung lautet: Verwerfen Sie das höchste Bit und füllen Sie das niedrigste Bit mit 0

Lassen Sie uns über die Rechtsverschiebung sprechen, dann ist die Rechtsverschiebung einfacher zu verstehen.

Rechtsverschiebung Das Konzept ist das Gegenteil der Linksverschiebung um ein paar Bits nach rechts zu verschieben. Durch Verschieben nach rechts bleibt das Vorzeichenbit unverändert, zum Beispiel:

int i = 0x80000000;
i = i >> 1;  //i的值不会变成0x40000000,而会变成0xc0000000

Das heißt, nachdem das Vorzeichenbit nach rechts verschoben wurde , 0 wird für positive Zahlen und 1 für negative Zahlen hinzugefügt, was der arithmetischen Rechtsverschiebung in der Assemblersprache entspricht. Wenn die Anzahl der verschobenen Bits die Länge des Typs überschreitet, wird entsprechend der Rest genommen und dann der Rest wird verschoben.

负数10100110 >>5(假设字长为8位),则得到的是  11111101

Kurz gesagt, in C ist die Linksverschiebung eine logische/arithmetische Linksverschiebung (beide sind genau das Gleiche), die Rechtsverschiebung ist eine arithmetische Rechtsverschiebung, die das Vorzeichenbit behält In tatsächlichen Anwendungen können Sie die Links-/Rechtsverschiebung verwenden, um je nach Situation schnelle Multiplikations-/Divisionsoperationen durchzuführen, was viel effizienter ist als Schleifen

Das obige ist der detaillierte Inhalt vonWie man die Linksverschiebungs- und Rechtsverschiebungsoperatoren in der C-Sprache versteht. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn