Embora a resposta aceita indique que endianess é um conceito da visão da memória. Mas não acho que isso responda diretamente à pergunta.
Algumas respostas me dizem que as operações bit a bit não dependem de endianess , e o processador pode representar os bytes de qualquer outra maneira. De qualquer forma, está falando que endianess é abstraída.
Mas quando fazemos alguns cálculos bit a bit no papel, por exemplo, não precisamos declarar a endianess em primeiro lugar? Na maioria das vezes escolhemos implicitamente uma endianess.
Por exemplo, suponha que temos uma linha de código como esta
0x1F & 0xEF
Como você calcularia o resultado manualmente, em um papel?
MSB 0001 1111 LSB
1110 1111
result: 0000 1111
Então, aqui usamos um formato Big Endian para fazer o cálculo. Você também pode usar Little Endian para calcular e obter o mesmo resultado.
Aliás, quando escrevemos números em código, acho que é como um formato Big Endian. 123456
ou 0x1F
, os números mais significativos começam da esquerda.
Novamente, assim que escrevemos um formato binário de um valor no papel, acho que já escolhemos uma Endianess e estamos vendo o valor como o vemos na memória.
Então, voltando à questão, uma operação de mudança <<
deve ser pensada como uma mudança de LSB (byte menos significativo) para MSB (byte mais significativo) .
Então, como no exemplo da pergunta:
numb=1025
Pequeno endian
LSB 00000001 00000100 00000000 00000000 MSB
Então, << 10
seria 10bit
mudar de LSB para MSB.
Comparação e << 10
operações para o formato Little Endian passo a 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!)
Uau! Eu recebo o resultado esperado conforme o OP descrito!
Os problemas que o OP não obteve o resultado esperado são:
Parece que ele não mudou do LSB para o MSB.
Ao mudar bits no formato Little Endian, você deve perceber (graças a Deus eu entendi) que:
LSB 10000000 00000000 MSB << 1
é
LSB 00000000 00000001 MSB
, não
LSB 01000000 00000000 MSB
Porque para cada indivíduo 8bits
, na verdade, estamos escrevendo em um MSB 00000000 LSB
formato Big Endian.
Então é como
LSB[ (MSB 10000000 LSB) (MSB 00000000 LSB) ]MSB
Resumindo:
Embora as operações bit a bit sejam abstraídas blablablabla ..., quando calculamos as operações bit a bit manualmente, ainda precisamos saber qual endianess estamos usando ao escrever o formato binário no papel. Também precisamos garantir que todos os operadores usem a mesma resistência.
O OP não obteve o resultado esperado porque ele fez a mudança errada.