Die akzeptierte Antwort weist jedoch darauf hin, dass Endianess ein Konzept aus der Sicht des Gedächtnisses ist. Aber ich denke nicht, dass das die Frage direkt beantwortet.
Einige Antworten sagen mir, dass bitweise Operationen nicht von der Endianess abhängen und der Prozessor die Bytes auf andere Weise darstellen kann. Wie auch immer, es geht darum, dass Endianess abstrahiert wird.
Aber wenn wir zum Beispiel einige bitweise Berechnungen auf dem Papier durchführen, müssen Sie dann nicht zuerst die Endianess angeben? Meistens wählen wir implizit eine Endianess.
Angenommen, wir haben eine solche Codezeile
0x1F & 0xEF
Wie würden Sie das Ergebnis von Hand auf Papier berechnen?
MSB 0001 1111 LSB
1110 1111
result: 0000 1111
Hier verwenden wir also ein Big Endian-Format, um die Berechnung durchzuführen. Sie können auch Little Endian verwenden, um das gleiche Ergebnis zu berechnen und zu erhalten.
Übrigens, wenn wir Zahlen in Code schreiben, denke ich, dass es wie ein Big Endian-Format ist. 123456
oder die 0x1F
meisten signifikanten Zahlen beginnen von links.
Sobald wir ein Binärformat eines Wertes auf das Papier schreiben, haben wir wahrscheinlich bereits eine Endianess ausgewählt und sehen den Wert so, wie wir ihn aus dem Speicher sehen.
Zurück zur Frage: Eine Verschiebungsoperation <<
sollte als Verschiebung von LSB (niedrigstwertiges Byte) zu MSB (höchstwertiges Byte) betrachtet werden .
Dann wie für das Beispiel in der Frage:
numb=1025
Kleiner Endian
LSB 00000001 00000100 00000000 00000000 MSB
So << 10
würde 10bit
Verschiebung von LSB zu MSB.
Vergleich und << 10
Operationen für das Little Endian-Format Schritt für Schritt:
MSB LSB
00000000 00000000 00000100 00000001 numb(1025)
00000000 00010000 00000100 00000000 << 10
LSB MSB
00000000 00000100 00010000 00000000 numb(1025) << 10, and put in a Little Endian Format
LSB MSB
00000001 00000100 00000000 00000000 numb(1205) in Little Endian format
00000010 00001000 00000000 00000000 << 1
00000100 00010000 00000000 00000000 << 2
00001000 00100000 00000000 00000000 << 3
00010000 01000000 00000000 00000000 << 4
00100000 10000000 00000000 00000000 << 5
01000000 00000000 00000001 00000000 << 6
10000000 00000000 00000010 00000000 << 7
00000000 00000001 00000100 00000000 << 8
00000000 00000010 00001000 00000000 << 9
00000000 00000100 00010000 00000000 << 10 (check this final result!)
Beeindruckend! Ich bekomme das erwartete Ergebnis wie im OP beschrieben!
Die Probleme, bei denen das OP nicht das erwartete Ergebnis erzielt hat, sind folgende:
Es scheint, dass er nicht von LSB zu MSB gewechselt ist.
Wenn Sie Bits im Little Endian-Format verschieben, sollten Sie Folgendes beachten (Gott sei Dank, ich erkenne es):
LSB 10000000 00000000 MSB << 1
ist
LSB 00000000 00000001 MSB
, nicht
LSB 01000000 00000000 MSB
Denn für jeden Einzelnen 8bits
schreiben wir es tatsächlich in einem MSB 00000000 LSB
Big Endian-Format.
So ist es wie
LSB[ (MSB 10000000 LSB) (MSB 00000000 LSB) ]MSB
Um zusammenzufassen:
Obwohl bitweise Operationen blablablabla weg abstrahiert werden sollen ... müssen wir bei der Berechnung bitweiser Operationen von Hand immer noch wissen, welche Endianess wir verwenden, wenn wir das Binärformat auf das Papier schreiben. Außerdem müssen wir sicherstellen, dass alle Operatoren dieselbe Endianess verwenden.
Das OP hat nicht das erwartete Ergebnis erzielt, weil er die Schaltung falsch gemacht hat.