Sebbene la risposta accettata sottolinei che l'endianità è un concetto dal punto di vista della memoria. Ma non credo che risponda direttamente alla domanda.
Alcune risposte mi dicono che le operazioni bit a bit non dipendono da endianess e che il processore può rappresentare i byte in qualsiasi altro modo. Ad ogni modo, si sta parlando che l'endianess viene sottratta.
Ma quando facciamo alcuni calcoli bit per bit sul documento, ad esempio, non è necessario indicare l'endianità in primo luogo? La maggior parte delle volte scegliamo implicitamente una endianess.
Ad esempio, supponiamo di avere una riga di codice come questa
0x1F & 0xEF
Come calcoleresti il risultato a mano, su un foglio?
MSB 0001 1111 LSB
1110 1111
result: 0000 1111
Quindi qui usiamo un formato Big Endian per fare il calcolo. Puoi anche usare Little Endian per calcolare e ottenere lo stesso risultato.
A proposito, quando scriviamo numeri in codice, penso che sia come un formato Big Endian. 123456
oppure 0x1F
, i numeri più significativi iniziano da sinistra.
Ancora una volta, non appena scriviamo un formato binario di un valore sulla carta, penso che abbiamo già scelto un Endianess e stiamo vedendo il valore come lo vediamo dalla memoria.
Quindi, tornando alla domanda, un'operazione di spostamento <<
dovrebbe essere considerata come spostamento da LSB (byte meno significativo) a MSB (byte più significativo) .
Quindi, come per l'esempio nella domanda:
numb=1025
Little Endian
LSB 00000001 00000100 00000000 00000000 MSB
Quindi << 10
passerebbe 10bit
da LSB a MSB.
Confronto e << 10
operazioni per il formato Little Endian passo dopo passo:
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!)
Wow! Ottengo il risultato atteso come descritto dall'OP!
I problemi che l'OP non ha ottenuto il risultato atteso sono i seguenti:
Sembra che non sia passato da LSB a MSB.
Quando si spostano i bit nel formato Little Endian, dovresti capire (grazie a Dio me ne rendo conto) che:
LSB 10000000 00000000 MSB << 1
è
LSB 00000000 00000001 MSB
, non è
LSB 01000000 00000000 MSB
Perché per ogni individuo 8bits
, in realtà lo stiamo scrivendo in un MSB 00000000 LSB
formato Big Endian.
Quindi è come
LSB[ (MSB 10000000 LSB) (MSB 00000000 LSB) ]MSB
Per riassumere:
Sebbene si dice che le operazioni bit per bit siano astratte via blablablabla ..., quando calcoliamo manualmente le operazioni bit per bit, dobbiamo ancora sapere quale endianità stiamo usando mentre scriviamo il formato binario sul foglio. Inoltre, dobbiamo assicurarci che tutti gli operatori utilizzino la stessa endianess.
L'OP non ha ottenuto il risultato atteso perché ha sbagliato il cambio.