Thursday 27 July 2017

Arithmetik Verschiebung Rechts Binär Optionen


Beim Verschieben nach links gibt es keinen Unterschied zwischen arithmetischer und logischer Verschiebung. Beim Verschieben nach rechts hängt die Art der Verschiebung von der Art des Wertes ab, der verschoben wird. (Als Hintergrund für die Leser, die mit der Differenz nicht vertraut sind, verschiebt eine logische Rechtsverschiebung um 1 Bit alle Bits nach rechts und füllt das linkste Bit mit einer 0. Eine arithmetische Verschiebung hinterlässt den ursprünglichen Wert im linken Bit Wichtig beim Umgang mit negativen Zahlen.) Beim Verschieben eines unsignierten Wertes ist der Operator in C eine logische Verschiebung. Beim Verschieben eines signierten Wertes ist der Operator eine arithmetische Verschiebung. Zum Beispiel unter der Annahme einer 32-Bit-Maschine: beantwortet Aug 11 08 um 9:16 so nah, Greg. Ihre Erklärung ist fast perfekt, aber die Verschiebung eines Ausdrucks von signierten Typ und negativen Wert ist implementiert. Siehe ISOIEC 9899: 1999 Abschnitt 6.5.7. Ndash Rob Sep 22 08 bei 22:53 Rob: Eigentlich, für Linkshänder und unterschriebene negative Zahl, ist das Verhalten undefiniert. Wenn die linke Verschiebung auch zu einem undefinierten Verhalten für positive signierte Werte führt, wenn der resultierende mathematische Wert (der in der Bitgröße begrenzt ist) nicht als positiver Wert in diesem signierten Typ dargestellt werden kann. Die Quintessenz ist, dass Sie sorgfältig vorgehen müssen, wenn Sie einen signierten Wert verschieben. Ndash Michael Burr Jun 21 13 um 0:30 Zuerst ist der Unterschied zwischen logischen und arithmetischen Verschiebungen aus mathematischer Sicht, ohne sich um die Datentypgröße zu sorgen. Logische Verschiebungen füllen immer verworfene Bits mit Nullen, während die arithmetische Verschiebung es mit Nullen nur für die linke Verschiebung füllt, aber für die rechte Verschiebung kopiert sie das MSB, wodurch das Zeichen des Operanden beibehalten wird (unter der Annahme einer Doppelkomplementkodierung für negative Werte). Mit anderen Worten, die logische Verschiebung betrachtet den verschobenen Operanden als nur einen Strom von Bits und verschiebt sie, ohne sich um das Zeichen des resultierenden Wertes zu kümmern. Arithmetische Verschiebung betrachtet es als eine (signierte) Zahl und bewahrt das Zeichen, wenn Verschiebungen gemacht werden. Eine linke arithmetische Verschiebung einer Zahl X durch n ist äquivalent zum Multiplizieren von X mit 2 n und entspricht somit einer logischen linken Verschiebung eine logische Verschiebung würde auch das gleiche Ergebnis ergeben, da MSB ohnehin vom Ende abfällt und nichts zu bewahren ist. Eine rechte arithmetische Verschiebung einer Zahl X durch n ist gleich einer ganzzahligen Teilung von X um 2 n NUR, wenn X nicht negativ ist. Integer-Teilung ist nichts als mathematische Teilung und runde Richtung 0 (trunc). Für negative Zahlen, die durch eine Doppelkomplement-Codierung dargestellt werden, hat die Verschiebung von rechts durch n Bits die Wirkung, sie mathematisch um 2 n zu dividieren und in Richtung (Boden) zu runden, also ist die richtige Verschiebung für nichtnegative und negative Werte unterschiedlich. Für X 0, X n X 2 n trunc (X 2 n) für X lt 0, X n Boden (X 2 n) wo ist die mathematische Teilung, ist eine ganzzahlige Teilung. Ein Beispiel: 37 2 18 (Rundung 18,5 in Richtung 0) 10010) 2 Ergebnis der arithmetischen Rechtsverschiebung -37) 10 11011011) 2 (unter Berücksichtigung eines Doppelkomplements, 8-Bit-Darstellung) -37 2 -18 (Rundung 18,5 in Richtung 0) 11101110) 2 NICHT das Ergebnis der arithmetischen Rechtsverschiebung -37 1 -19 (Rundung 18,5 in Richtung) 11101101) 2 Ergebnis der arithmetischen Rechtsverschiebung Wie Guy Steele darauf hingewiesen hat. Diese Diskrepanz hat zu Bugs in mehr als einem Compiler geführt. Hier kann nicht-negativ (Mathematik) auf unsignierte und unterschriebene nicht-negative Werte (C) abgebildet werden, die beide gleich behandelt werden und die Rechtsverschiebung erfolgt durch eine ganzzahlige Teilung. So logisch und arithmetisch sind äquivalent in Linksverschiebung und für nicht-negative Werte bei der richtigen Verschiebung bei der richtigen Verschiebung von negativen Werten, die sie unterscheiden. Operanden - und Ergebnistypen Standard C99 6.5.7: Jeder der Operanden muss Integer-Typen haben. Die Integer-Promotions werden auf jedem der Operanden durchgeführt. Die Art des Ergebnisses ist die des geförderten linken Operanden. Wenn der Wert des rechten Operanden negativ ist oder größer oder gleich der Breite des geförderten linken Operanden ist, ist das Verhalten undefiniert. In dem obigen Snippet werden beide Operanden int (aufgrund einer ganzzahligen Promotion), wenn E2 negativ war oder E2 sizeof (int) CHARBIT, dann ist die Operation undefiniert. Dies ist, weil das Verschieben mehr als die verfügbaren Bits wird sicher überlaufen. Hatte R als kurz erklärt worden. Würde das int-Ergebnis des Schichtvorgangs implizit in eine kurze Verringerung umgewandelt werden, was zu einem implementierungsdefinierten Verhalten führen kann, wenn der Wert im Zieltyp nicht darstellbar ist. Linke Verschiebung Das Ergebnis von E1 ltlt E2 ist E1 linksverschobene E2-Bit-Positionen, die freie Bits mit Nullen gefüllt sind. Wenn E1 einen unsignierten Typ hat, ist der Wert des Ergebnisses E12 E2. Reduzierter modulo ein mehr als der im Ergebnistyp darstellbare Maximalwert. Wenn E1 einen signierten Typ und einen nicht-negativen Wert hat und E12 E2 im Ergebnistyp darstellbar ist, dann ist das der resultierende Wert ansonsten das Verhalten undefiniert. Da die linken Verschiebungen für beide gleich sind, werden die freien Bits einfach mit Nullen gefüllt. Es heißt dann, dass für beide unsigned und signierte Typen eine arithmetische Verschiebung ist. Im Interpretation es als arithmetische Verschiebung, da logische Verschiebungen sich nicht um den Wert, der durch die Bits repräsentiert wird, stören, sieht er es nur als einen Strom von Bits an, aber die Standardgespräche nicht in Bezug auf Bits, sondern durch die Definition in Bezug auf den Wert, der durch erhalten wird Das Produkt von E1 mit 2 E2. Die Einschränkung ist, dass für signierte Typen der Wert nicht negativ sein sollte und der resultierende Wert in der Ergebnistyp darstellbar sein sollte. Andernfalls ist die Operation undefiniert. Der Ergebnistyp wäre der Typ der E1 nach der Anwendung der integralen Promotion und nicht der Ziel (die Variable, die das Ergebnis halten wird). Der daraus resultierende Wert wird implizit in den Zieltyp konvertiert, wenn er in diesem Typ nicht darstellbar ist, dann ist die Umwandlung implementiert (C99 6.3.1.33). Wenn E1 ein signierter Typ mit einem negativen Wert ist, dann ist das Verhalten der linken Verschiebung undefiniert. Dies ist ein einfacher Weg zu undefiniertem Verhalten, das leicht übersehen werden kann. Rechtsverschiebung Das Ergebnis von E1 E2 ist E1 rechtsverschobene E2-Bit-Positionen. Wenn E1 einen unsignierten Typ hat oder wenn E1 einen signierten Typ und einen nicht-negativen Wert hat, ist der Wert des Ergebnisses der integrale Teil des Quotienten von E12 E2. Wenn E1 einen signierten Typ und einen negativen Wert hat, ist der resultierende Wert implementiert. Richtige Verschiebung für unsignierte und unterschriebene nicht-negative Werte sind ziemlich direkt, die freien Bits sind mit Nullen gefüllt. Bei signierten negativen Werten ist das Ergebnis der richtigen Verschiebung implementiert. Das heißt, die meisten Implementierungen wie GCC und Visual C implementieren rechts-Verschiebung als arithmetische Verschiebung durch die Erhaltung der Zeichen-Bit. Fazit Im Gegensatz zu Java, das einen speziellen Operator hat, um für die logische Verschiebung abgesehen von den üblichen gtgt und ltlt. C und C haben nur arithmetische Verschiebung mit einigen Bereichen links undefiniert und implementierungsdefiniert. Der Grund, warum ich sie als Arithmetik betrachte, liegt an der Standardformulierung der Operation mathematisch anstatt, den verschobenen Operanden als Stream von Bits zu behandeln, das ist vielleicht der Grund, warum es diese Bereiche unimplementationsdefiniert lässt, anstatt nur alle Fälle als logische Verschiebungen zu definieren. In Bezug auf die Art der Schicht, die Sie bekommen, ist das Wichtigste die Art des Wertes, den Sie verlagern. Eine klassische Quelle von Bugs ist, wenn Sie eine wörtliche zu, sagen, Maske aus Bits verschieben. Zum Beispiel, wenn du das übrigste Bit einer vorzeichenlosen Ganzzahl löschen möchtest, dann kannst du das als deine Maske ausprobieren: Unglücklicherweise bekommst du dich in Schwierigkeiten, weil die Maske alle seine Bits gesetzt hat, weil der Wert verschoben wird (0) signiert ist, so wird eine arithmetische Verschiebung durchgeführt. Stattdessen wollen Sie eine logische Verschiebung erzwingen, indem Sie explizit den Wert als unsigned deklarieren, d. h. indem Sie so etwas tun: Nun, ich habe es auf wikipedia gesehen. Und sie haben das zu sagen: C hat aber nur einen rechten Schichtbetreiber,. Viele C-Compiler wählen, welche Rechtsverschiebung je nachdem, welche Art von Integer verschoben wird, oft signierte Ganzzahlen werden mit der arithmetischen Verschiebung verschoben, und unsigned Integers werden mit der logischen Verschiebung verschoben. So klingt es wie es hängt von deinem compiler ab. Auch in diesem Artikel, beachten Sie, dass die linke Schicht ist die gleiche für arithmetische und logische. Ich würde empfehlen, einen einfachen Test mit einigen signierten und unsignierten Zahlen auf dem Randfall (High-Bit-Set natürlich) und sehen, was das Ergebnis auf Ihrem Compiler ist. Ich würde auch empfehlen, zu vermeiden, je nachdem, ob es ein oder das andere ist, da es scheint, dass C keinen Standard hat, zumindest wenn es vernünftig und möglich ist, eine solche Abhängigkeit zu vermeiden. Antwortete am 11. August 08 um 9:18 Obwohl die meisten C-Compiler eine arithmetische Linksverschiebung für signierte Werte hatten, scheint ein solches hilfreiches Verhalten veraltet zu sein. Die gegenwärtige Compilerphilosophie scheint zu der Annahme zu sein, dass die Leistung einer Linksverschiebung auf einer Variablen einen Compiler berechtigt, anzunehmen, dass die Variable nicht negativ sein muss und somit irgendeinen Code anderswo weglässt, der für ein korrektes Verhalten notwendig wäre, wenn die Variable negativ war . Ndash supercat Apr 16 15 at 5:47 Linkshänder ltlt Das ist irgendwie einfach und wann immer du den Schiebeoperator benutzt hast, ist es immer ein bisschen weiser Betrieb, also können wir ihn nicht mit einem Doppel - und Schwimmerbetrieb bedienen. Wann immer wir die Verschiebung einer Null verlassen haben, wird sie immer dem niedrigstwertigen Bit (LSB) hinzugefügt. Aber in der richtigen Schicht müssen wir einer weiteren Regel folgen und diese Regel heißt Vorzeichen Bit Kopie. Bedeutung der Vorzeichen-Bit-Kopie ist, wenn das höchstwertige Bit (MSB) gesetzt ist, dann wird nach einer rechten Verschiebung wieder das MSB gesetzt, wenn es zurückgesetzt wurde, dann wird es wieder zurückgesetzt, bedeutet, wenn der vorherige Wert null war, dann nach dem erneuten Verschieben der Bit ist null, wenn das vorherige Bit eins war, dann nach der Schicht ist es wieder eins. Diese Regel gilt nicht für eine Linksverlagerung. Das wichtigste Beispiel für die rechte Verschiebung, wenn man eine negative Zahl nach rechts verschiebt, dann nach einer Verschiebung der Wert endlich auf Null zu erreichen und dann danach, wenn dies verschiebt, wird diese Zahl beliebig oft der Wert bleiben. Bitte prüfe. Antwortete Mar 30 14 um 11: 04Right jetzt lese ich das Buch Computer Systems. Programmiererperspektive. Ein Problem in dem Buch sagt, um eine logische Rechtsverschiebung auf einer signierten Ganzzahl durchzuführen, ich kann nicht herausfinden, wie man anfängt. Im Folgenden ist die eigentliche Frage aus dem Buch. Füllen Sie den Code für die folgenden C-Funktionen aus. Die Funktion srl führt eine logische Rechtsverschiebung unter Verwendung einer arithmetischen Rechtsverschiebung (gegeben durch den Wert xsra) durch, gefolgt von anderen Operationen ohne Rechtsverschiebungen oder Division. Die Funktion sra führt eine arithmetische Rechtsverschiebung unter Verwendung einer logischen Rechtsverschiebung (gegeben durch den Wert xsrl) durch, gefolgt von anderen Operationen, die keine reinen Verschiebungen oder Teilungen beinhalten. Sie können die Berechnungen 8sizeof (int) verwenden, um w zu bestimmen, die Anzahl der Bits im Datentyp int. Der Verschiebungsbetrag k kann von 0 bis w 1 liegen. Ich hoffe du verstehst jetzt die Frage. Fragte am 27. Juli um 3:18 Ich gebe dir keine vollständige Antwort, da dies anscheinend Hausaufgaben ist, aber krank gibt dir einige Hinweise, um dir zu helfen, es selbst auszuprobieren: Für eine logische Rechtsverschiebung von N Bits musst du die Spitze löschen N Bits des Ergebnisses nach arithmetischer Verschiebung können Sie Bits in einem Wert löschen, indem Sie eine entsprechende Maske anwenden. In der Regel mit einem bitweisen AND oder XOR, um die oberen N Bits eines Wertes zu löschen, den du eine Maske mit N 0s und verbleibenden Bits eins brauchst 1 kannst du eine passende Maske mit linker Verschiebung durch W - N Bits erzeugen, wobei W die Anzahl der Bits ist Ein Wort (das man als W sizeof (int) CHARBIT berechnen kann) ZB Für eine logische Rechtsverschiebung um 3 Der schwierigste Teil erzeugt die Maske, aber wenn man darüber nachdenkt, dass linke Verschiebungen so ein geeigneter Wert angewendet werden, vielleicht gefolgt von einer weiteren bitweisen Operation, dann solltest du bald eine ziemlich einfache Lösung sehen Korrekte Darstellung für -164 Nr. Das Ergebnis stellt eine große positive Zahl dar, nicht -4 Shift Right Arithmetik Eine rechte Verschiebung logische kann nicht verwendet werden, um eine negative Ganzzahl durch zwei zu teilen. Das Problem ist, dass eine Verschiebung rechts logische Nullen in das Bit hoher Ordnung bewegt. Dies ist in einigen Situationen wünschenswert, aber nicht zum Teilen von negativen ganzen Zahlen, wobei das Bit hoher Ordnung das Vorzeichenbit ist. Eine arithmetische Rechtsverschiebung repliziert das Vorzeichenbit nach Bedarf, um Bitpositionen zu füllen: FRAGE 13: Gibt es eine arithmetische Verschiebung links Befehl

No comments:

Post a Comment