Ist Endianness bei den bitweisen Operationen überhaupt wichtig? Entweder logisch oder wechselnd?
Ich arbeite an Hausaufgaben in Bezug auf bitweise Operatoren, und ich kann weder Kopf noch Zahl darauf machen, und ich denke, ich bin ziemlich auf die Endianess fixiert. Das heißt, ich benutze eine kleine Endian-Maschine (wie die meisten), aber muss dies berücksichtigt werden oder ist es eine verschwendete Tatsache?
Falls es darauf ankommt, benutze ich C.
c
bit-manipulation
endianness
bit-shift
Frank V.
quelle
quelle
128 << 2 == 512
auf jeder CPU?“, Diese Frage ist , wie „nicht128 << 2
auslegen , wie0x02 0x00
auf jeder CPU?“.Antworten:
Endianness ist nur für das Layout der Daten im Speicher von Bedeutung. Sobald Daten von dem zu bearbeitenden Prozessor geladen werden, spielt die Endianness keine Rolle mehr. Verschiebungen, bitweise Operationen usw. werden unabhängig von der Endianness wie erwartet ausgeführt (Daten logisch als Bit niedriger Ordnung zu hoch angeordnet).
quelle
Die bitweisen Operatoren abstrahieren die Endianness. Beispielsweise
>>
verschiebt der Operator die Bits immer in Richtung der niedrigstwertigen Ziffer. Dies bedeutet jedoch nicht, dass Sie die Endianness sicher ignorieren können, wenn Sie sie verwenden. Wenn Sie beispielsweise einzelne Bytes in einer größeren Struktur bearbeiten, 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 nicht einverstanden. Der Punkt, den ich ansprechen möchte, ist zu betonen, dass die bitweisen Operatoren zwar im Wesentlichen endianneutral sind, Sie jedoch den Effekt der Endianess in Ihrem Code nicht ignorieren können, insbesondere wenn Sie ihn mit anderen Operatoren kombinieren.
quelle
Wie andere bereits erwähnt haben, werden Verschiebungen durch die C-Sprachspezifikation definiert und sind unabhängig von der Endianness. Die Implementierung einer Rechtsverschiebung kann jedoch variieren, je nachdem, ob die Architektur die Komplementarithmetik des eigenen oder des zweiten Komplements verwendet.
quelle
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 einen neuen Gusstyp beinhaltet, gehen Sie vorsichtig vor.
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
int
in einchar
:int i = 1; char *ptr; ... ptr = (char *) &i; //Cast it here return (*ptr);
quelle
{union { int i = 1; char a[4];} b;return b.a[3] == 1;} //big endian
Sie haben keine Sprache angegeben, aber normalerweise werden Programmiersprachen wie C abstrakte Endianness in bitweisen Operationen entfernt. Also nein, es spielt bei bitweisen Operationen keine Rolle.
quelle