Bitweise Operatoren und “Endianness”

Lesezeit: 3 Minuten

Benutzeravatar von Frank V
Frank v

Tut Endianität überhaupt egal mit den bitweisen Operationen? Entweder logisch oder verschiebend?

Ich arbeite an Hausaufgaben in Bezug auf bitweise Operatoren, und ich kann nicht Kopf oder Zahl darauf machen, und ich glaube, ich werde ziemlich auf die Endianess fixiert. Das heißt, ich verwende eine kleine Endian-Maschine (wie die meisten), aber muss dies berücksichtigt werden oder ist es eine verschwendete Tatsache?

Falls es wichtig ist, ich benutze C.

  • Duplizieren: stackoverflow.com/questions/7184789/…

    – 0andriy

    19. November 2015 um 11:54 Uhr

  • IMHO, das sind etwas andere Fragen. Diese Frage ist wie „ist 128 << 2 == 512 auf jeder CPU?”, diese Frage ist wie “does 128 << 2 auslegen als 0x02 0x00 auf jeder CPU?”.

    – kolen

    2. Januar 2019 um 16:32 Uhr

Endianness spielt nur für das Layout von Daten im Speicher eine Rolle. Sobald Daten vom zu bearbeitenden Prozessor geladen werden, ist Endianness völlig irrelevant. Verschiebungen, bitweise Operationen usw. werden erwartungsgemäß ausgeführt (Daten werden logisch als niederwertiges Bit zu hoch angeordnet), unabhängig von der Endianness.

  • Sollte es nicht logisch “High to Low Order Bit” sein?

    – legends2k

    8. September 2012 um 21:37 Uhr


  • @legends2k: hatte den gleichen Gedanken

    – Giorgi Moniava

    2. März 2015 um 12:53 Uhr

  • @legends2k: ja. Verschiebung nach links = multiplizieren mit Potenz von 2. Verschiebung nach rechts = dividieren durch Potenz von 2 (mit anderer Rundung als ganzzahlige Division für negative Werte).

    – Peter Cordes

    4. August 2015 um 20:40 Uhr

  • @JoshC: Nein, der PDP-10 würde die Operation nur so ausführen, wie sie logisch für die Daten definiert ist, unabhängig davon, welches Bit genau wo in seinem Speicher / seinen Registern angeordnet ist. Bedenken Sie: Wenn Sie zwei 32-Bit-Ganzzahlen addieren, müssen Sie sich keine Sorgen darüber machen, dass der Prozessor die Daten konvertieren muss, damit die Addition funktioniert (noch machen Sie sich Gedanken über die Reihenfolge der Bits in einem Byte in der Hardware) – die ALU macht einfach das “Richtige”, weil es so verdrahtet ist, dass es mit seiner Hardware funktioniert. Die Verschiebungen sind auf die gleiche Weise – sie bearbeiten die Daten auf eine Weise, die die Details der Byte-/Bit-Reihenfolge der Hardware abstrahiert.

    – mtraceur

    16. April 2016 um 17:38 Uhr

  • @JoshC: (Forts.) Und in C sind die Bitverschiebungsoperatoren so definiert, dass sie noch mehr abstrahiert werden: Sie werden in Bezug auf die Werte definiert, die sie erzeugen, nicht in Bezug auf die Art und Weise, wie sie die zugrunde liegenden Bits verschieben ( Wenn Sie sich also auf einer obskuren Plattform befinden, auf der eine Hardware-Bitverschiebungsanweisung ein ungültiges Bitlayout erzeugen würde, z. B. wenn Sie ein Wertbit in ein Füllbit verschoben haben, ist ein konformer Compiler erforderlich, um Anweisungen zu erstellen, die dies umgehen, wie z Ich verstehe es).

    – mtraceur

    16. April 2016 um 17:41 Uhr

Benutzeravatar von 1800 INFORMATION
1800 INFORMATIONEN

Die bitweisen Operatoren abstrahieren die Endianness. Zum Beispiel die >> Operator verschiebt die Bits immer in Richtung der niederwertigsten Stelle. Dies bedeutet jedoch nicht, dass Sie Endianness bei der Verwendung vollständig ignorieren können. Wenn Sie beispielsweise mit einzelnen Bytes in einer größeren Struktur arbeiten, können Sie nicht immer davon ausgehen, dass sie an derselben Stelle liegen.

short temp = 0x1234;
temp = temp >> 8;

// on little endian, c will be 0x12, on big endian, it will be 0x0
char c=((char*)&temp)[0];

Zur Verdeutlichung bin ich mit den anderen Antworten hier nicht grundsätzlich einverstanden. Ich versuche zu betonen, dass die bitweisen Operatoren zwar im Wesentlichen Endian-neutral sind, Sie den Effekt der Endianität in Ihrem Code jedoch nicht ignorieren können, insbesondere wenn sie mit anderen Operatoren kombiniert werden.

  • Sie sind im Grunde mit allen nicht einverstanden, aber Ihre Antwort wurde dennoch als die beste gewertet. Wie können die Verhaltensweisen identifiziert werden?

    – Frank v

    25. Juni 2009 um 0:33 Uhr

  • Ich habe eine weitere Klarstellung hinzugefügt

    – 1800 INFORMATIONEN

    25. Juni 2009 um 0:57 Uhr

  • Um dies weiter zu verdeutlichen, meinen Sie, wenn ich nicht tatsächlich Werte in Bytes abrufe, ist alles in Ordnung?

    – Suvarna Pattayil

    11. Februar 2015 um 14:31 Uhr

  • Oo also >> und << sind überhaupt keine Rechts- oder Linksverschiebung; Sie sind "Verschiebung in Richtung am wenigsten signifikant und Verschiebung in Richtung am signifikantesten". das macht "Division und Multiplikation durch Verschieben" Endianness unabhängig ... jetzt bin ich verwirrt, ob das Casting über Memcpy dies durcheinander bringen würde.

    – Dmitri

    21. Oktober 2017 um 23:22 Uhr


Wie andere bereits erwähnt haben, werden Verschiebungen durch die C-Sprachspezifikation definiert und sind unabhängig von Endianness, aber die Implementierung einer Rechtsverschiebung kann variieren, je nachdem, ob die Architektur Einer-Komplement- oder Zweier-Komplement-Arithmetik verwendet.

Benutzeravatar von Rongkai Xu
Rongkai Xu

Es hängt davon ab, ob. Ohne die Zahl in einen neuen Typ umzuwandeln, können Sie die Endianness transparent behandeln.

Wenn Ihre Operation jedoch ein Casting neuer Typen beinhaltet, seien Sie vorsichtig.

Wenn Sie beispielsweise einige Bits nach rechts verschieben und (explizit oder nicht) in einen neuen Typ umwandeln möchten, ist Endianness wichtig!

Um Ihre Endianness zu testen, können Sie einfach ein casten int in ein char:

int i = 1;

char *ptr;

...

ptr = (char *) &i;  //Cast it here

return  (*ptr);

Sie haben keine Sprache angegeben, aber normalerweise abstrakt Programmiersprachen wie C Endianness weg in bitweise Operationen. Also nein, es spielt keine Rolle bei bitweisen Operationen.

  • Angesichts der Tatsache, dass die Frage keine Überarbeitungen hat, bin ich überrascht, dass Sie sagen, dass er die Sprache nicht erwähnt hat, wenn er dies tut, und sie ist auch als C gekennzeichnet.

    – Simeon Pilger

    25. Juni 2009 um 2:27 Uhr

  • @Simeon: Zu der Zeit, als ich diese Antwort schrieb, hatte es das nicht. Bearbeitungen eines einzelnen Autors in einem kleinen Zeitrahmen werden zu einer zusammengeführt. Deshalb sehen Sie es als eine einzelne Überarbeitung.

    – mmx

    25. Juni 2009 um 2:52 Uhr

  • Angesichts der Tatsache, dass die Frage keine Überarbeitungen hat, bin ich überrascht, dass Sie sagen, dass er die Sprache nicht erwähnt hat, wenn er dies tut, und sie ist auch als C gekennzeichnet.

    – Simeon Pilger

    25. Juni 2009 um 2:27 Uhr

  • @Simeon: Zu der Zeit, als ich diese Antwort schrieb, hatte es das nicht. Bearbeitungen eines einzelnen Autors in einem kleinen Zeitrahmen werden zu einer zusammengeführt. Deshalb sehen Sie es als eine einzelne Überarbeitung.

    – mmx

    25. Juni 2009 um 2:52 Uhr

1418910cookie-checkBitweise Operatoren und “Endianness”

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy