Kabul edilen cevap, endianess'in hafıza görünümünden bir kavram olduğuna işaret ediyor. Ama bunun doğrudan soruyu cevapladığını sanmıyorum.
Bazı cevaplar bana bitsel işlemlerin endianess'e bağlı olmadığını ve işlemcinin baytları başka bir şekilde temsil edebileceğini söylüyor . Her neyse, bu endianess'in soyutlanmasından bahsediyor.
Ancak, örneğin kağıt üzerinde bitsel hesaplamalar yaptığımızda, ilk etapta endianiliği belirtmeniz gerekmez mi? Çoğu zaman örtük olarak bir endianess seçeriz.
Örneğin, böyle bir kod satırımız olduğunu varsayalım
0x1F & 0xEF
Sonucu bir kağıt üzerinde elle nasıl hesaplarsınız?
MSB 0001 1111 LSB
1110 1111
result: 0000 1111
Burada hesaplama yapmak için bir Big Endian formatı kullanıyoruz. Aynı sonucu hesaplamak ve elde etmek için Little Endian'ı da kullanabilirsiniz.
Btw, sayıları kod yazdığımızda, sanırım Big Endian formatına benziyor. 123456
veya 0x1F
en anlamlı sayılar soldan başlar.
Yine, kağıda bir değerin ikili bir biçimini yazar yazmaz, sanırım zaten bir Endianess seçtik ve değeri bellekten gördüğümüz gibi görüyoruz.
Dolayısıyla soruya geri dönersek, bir vardiya işleminin LSB'den (en az önemli bayt) MSB'ye (en önemli bayt) geçiş<<
olduğu düşünülmelidir .
Sonra sorudaki örneğe gelince:
numb=1025
Küçük Endian
LSB 00000001 00000100 00000000 00000000 MSB
Yani << 10
olacağını 10bit
LSB'den MSB ye kayıyor.
<< 10
Little Endian formatı için adım adım karşılaştırma ve işlemler:
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!)
Vaov! OP açıklandığı gibi beklenen sonucu elde!
OP'nin beklenen sonucu alamadığı sorunlar:
LSB'den MSB'ye geçmediği anlaşılıyor.
Bitleri Little Endian biçiminde kaydırırken şunu fark etmelisiniz (şükürler olsun ki anlıyorum):
LSB 10000000 00000000 MSB << 1
olduğunu
LSB 00000000 00000001 MSB
, değil
LSB 01000000 00000000 MSB
Çünkü her birey için 8bits
, onu bir MSB 00000000 LSB
Big Endian formatında yazıyoruz .
Yani böyle
LSB[ (MSB 10000000 LSB) (MSB 00000000 LSB) ]MSB
Sonuç olarak:
Bitsel işlemlerin blablablabla'yı soyutladığı söylense de, bitsel işlemleri elle hesapladığımızda, kağıda ikili formatı yazarken hangi endianess'i kullandığımızı bilmemiz gerekir. Ayrıca tüm operatörlerin aynı endianess'i kullandığından emin olmalıyız.
OP beklenen sonucu alamamış olması nedeniyle kaymayı yanlış yapmıştı.