Хотя принятый ответ указывает на то, что бесконечность является понятием с точки зрения памяти. Но я не думаю, что это ответит на вопрос напрямую.
Некоторые ответы говорят мне, что побитовые операции не зависят от порядка байтов , и процессор может представлять байты любым другим способом. Во всяком случае, речь идет об этой абстракции.
Но когда мы делаем некоторые побитовые вычисления, например, на бумаге, не нужно ли указывать порядковый номер в первую очередь? В большинстве случаев мы выбираем порядок байтов неявно.
Например, предположим, что у нас есть строка кода, подобная этой
0x1F & 0xEF
Как бы вы рассчитали результат вручную, на бумаге?
MSB 0001 1111 LSB
1110 1111
result: 0000 1111
Поэтому здесь мы используем формат Big Endian, чтобы сделать расчет. Вы также можете использовать Little Endian для расчета и получения того же результата.
Кстати, когда мы пишем числа в коде, я думаю, что это формат Big Endian. 123456
или0x1F
наиболее значимые цифры начинаются слева.
Опять же, как только мы напишем какой-нибудь двоичный формат значения на бумаге, я думаю, что мы уже выбрали Endianess, и мы рассматриваем значение так, как мы видим его из памяти.
Итак, возвращаясь к вопросу, операция сдвига <<
должна рассматриваться как смещение от младшего бита (младший байт) к старшему биту (старший байт) .
Тогда как для примера в вопросе:
numb=1025
Little Endian
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
Подводить итоги:
Хотя побитовые операции называются абстрагированными, блаблабла ..., когда мы вычисляем побитовые операции вручную, нам все равно нужно знать, какую последовательность мы используем, записывая двоичный формат на бумаге. Также нам нужно убедиться, что все операторы используют один и тот же порядок байтов.
ОП не получил ожидаемый результат, потому что он сделал сдвиг неправильно.