Хоча прийнята відповідь вказує, що ендіатизм - це поняття з точки зору пам'яті. Але я не думаю, що це відповідає безпосередньо на питання.
Деякі відповіді говорять мені про те, що побітові операції не залежать від витривалості , і процесор може представляти байти будь-яким іншим способом. У всякому разі, це говорить про те, що ендіазність стає абстрагованою.
Але, наприклад, коли ми робимо кілька розрядних підрахунків на папері, чи не потрібно в першу чергу констатувати цілеспрямованість? У більшості випадків ми вибираємо ендіатичність неявно.
Наприклад, припустимо, у нас є такий рядок коду
0x1F & 0xEF
Як би ви обчислили результат вручну, на папері?
MSB 0001 1111 LSB
1110 1111
result: 0000 1111
Отже, тут ми використовуємо формат Big Endian для розрахунку. Ви також можете використовувати Little Endian для обчислення та отримання однакового результату.
До речі, коли ми пишемо числа в коді, я думаю, що це як формат Big Endian. 123456
або 0x1F
, найбільш значні числа починаються зліва.
Знову ж таки, як тільки ми записуємо на папері якийсь двійковий формат значення, я думаю, що ми вже вибрали Endianess, і ми переглядаємо значення так, як ми його бачимо з пам'яті.
Тож назад до питання, операцію зсуву <<
слід розглядати як перехід від LSB (найменш значущий байт) до MSB (найбільш значущий байт) .
Тоді як для прикладу у питанні:
numb=1025
Маленький Ендіан
LSB 00000001 00000100 00000000 00000000 MSB
Так << 10
було б 10bit
перехід від LSB до MSB.
Порівняння та << 10
операції для формату Little Endian поетапно:
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!)
Оце Так! Я отримую очікуваний результат, як описано в ОП!
Проблеми, через які ОП не отримала очікуваного результату, полягають у тому, що:
Схоже, що він не перейшов від LSB до MSB.
Під час переміщення бітів у форматі Little Endian ви повинні усвідомити (слава богу, я це розумію), що:
LSB 10000000 00000000 MSB << 1
є
LSB 00000000 00000001 MSB
, ні
LSB 01000000 00000000 MSB
Тому що для кожної людини 8bits
ми фактично пишемо це у форматі MSB 00000000 LSB
Big Endian.
Так це як
LSB[ (MSB 10000000 LSB) (MSB 00000000 LSB) ]MSB
Підсумовуючи:
Хоча побитові операції, як кажуть, абстрагуються від блаблаблабла ..., коли ми обчислюємо побітові операції вручну, нам все одно потрібно знати, яку цілеспрямованість ми використовуємо, записуючи на папері двійковий формат. Також нам потрібно переконатися, що всі оператори використовують однакову ендіативність.
ОП не отримав очікуваного результату через те, що він змінився неправильно.