Meskipun jawaban yang diterima menunjukkan bahwa endianess adalah konsep dari pandangan memori. Tapi saya tidak berpikir itu menjawab pertanyaan secara langsung.
Beberapa jawaban memberi tahu saya bahwa operasi bitwise tidak bergantung pada endianess , dan prosesor dapat mewakili byte dengan cara lain. Ngomong-ngomong, itu berbicara tentang endianess yang akan diabstraksikan.
Tetapi ketika kita melakukan perhitungan bitwise di kertas misalnya, tidak perlu menyatakan endianess di tempat pertama? Seringkali kita memilih endianess secara implisit.
Misalnya, anggap kita memiliki garis kode seperti ini
0x1F & 0xEF
Bagaimana Anda menghitung hasilnya dengan tangan, di atas kertas?
MSB 0001 1111 LSB
1110 1111
result: 0000 1111
Jadi di sini kita menggunakan format Big Endian untuk melakukan perhitungan. Anda juga dapat menggunakan Little Endian untuk menghitung dan mendapatkan hasil yang sama.
Btw, ketika kita menulis angka dalam kode, saya pikir itu seperti format Big Endian. 123456
atau 0x1F
, angka paling signifikan dimulai dari kiri.
Sekali lagi, segera setelah kita menulis beberapa format biner dari nilai di atas kertas, saya pikir kita sudah memilih Endianess dan kita melihat nilainya seperti yang kita lihat dari memori.
Jadi kembali ke pertanyaan, operasi shift <<
harus dianggap bergeser dari LSB (byte paling signifikan) ke MSB (byte paling signifikan) .
Kemudian untuk contoh dalam pertanyaan:
numb=1025
Little Endian
LSB 00000001 00000100 00000000 00000000 MSB
Jadi << 10
akan 10bit
bergeser dari LSB ke MSB.
Perbandingan dan << 10
operasi untuk format Little Endian langkah demi langkah:
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! Saya mendapatkan hasil yang diharapkan seperti yang dijelaskan OP!
Masalah yang OP tidak dapatkan hasil yang diharapkan adalah:
Tampaknya dia tidak beralih dari LSB ke MSB.
Ketika menggeser bit dalam format Little Endian, Anda harus menyadari (terima kasih Tuhan, saya sadari) bahwa:
LSB 10000000 00000000 MSB << 1
adalah
LSB 00000000 00000001 MSB
, tidak
LSB 01000000 00000000 MSB
Karena untuk setiap individu 8bits
, kami sebenarnya menulisnya dalam MSB 00000000 LSB
format Big Endian.
Jadi seperti itu
LSB[ (MSB 10000000 LSB) (MSB 00000000 LSB) ]MSB
Untuk menyimpulkan:
Meskipun operasi bitwise dikatakan diabstraksi dari blablablabla ..., ketika kita menghitung operasi bitwise dengan tangan, kita masih perlu mengetahui endianess apa yang kita gunakan saat kita menuliskan format biner di atas kertas. Kami juga perlu memastikan semua operator menggunakan endianess yang sama.
OP tidak mendapatkan hasil yang diharapkan karena dia melakukan kesalahan shifting.