порядок следования битов и порядковый номер - PullRequest
6 голосов
/ 14 апреля 2010

Я читаю файл побайтно.

Скажем, например, у меня есть этот байт: 0x41 (0100 0001), представленный в шестнадцатеричном.

Теперь я хочу первые три бита этого байта, т.е. (010).

Я могу использовать побитовую логику, чтобы извлечь первые три бита, но мой вопрос в том, будут ли первые три бита независимыми от порядкового номера машины (т. Е. Они не могут быть 001)?

Спасибо

Ответы [ 6 ]

7 голосов
/ 14 апреля 2010

Еще один способ думать об этом состоит в том, что порядок байтов применяется только тогда, когда вы можете читать компоненты элемента по отдельности - поскольку вы обычно можете независимо читать из памяти отдельные байты 32-битного целого, если вы хотите интерпретировать эти байты как 32-разрядный тип int, вы не должны гарантировать, что порядковый номер архитектуры принимается во внимание.

Обычно вы не можете прочитать из памяти отдельные биты байта, так что на самом деле нет понятия «битовой последовательности» в том, что касается архитектуры памяти (я уверен, что на аппаратном уровне, но не то, что вы можете увидеть на уровне программного обеспечения). Несколько областей, в которых вам, возможно, придется иметь дело (или, по крайней мере, помнить) о порядке байтов:

  1. порядок, в котором компилятор хранит биты битового поля, зависит от компилятора (и не обязательно связан с порядком байтов аппаратной платформы - разные компиляторы могут по-разному упорядочивать битовые поля для одной и той же платформы - возможно, что Компилятор может быть настроен так или иначе с использованием параметров командной строки, аналогично тому, как char может быть установлен как подписанный или без знака). Однако битовые поля C на самом деле не имеют ничего общего с аппаратной адресацией.

  2. некоторые аппаратные архитектуры позволяют адресовать отдельные биты (например, ARM Cortex M3), поэтому в этом случае вам нужно знать, как устроена архитектура для адресации битов, если вы собираетесь использовать это особенность.

  3. если вы отправляете биты по последовательному каналу - аппаратный интерфейс обычно указывает, будет ли самый старший или младший бит «смещен» в проводе первым.

7 голосов
/ 14 апреля 2010

Порядковый номер относится только к порядку байтов, а не к порядку битов. Порядок битов в соответствующем байте будет одинаковым.

3 голосов
/ 14 апреля 2010

Да, они будут одинаковыми.

Порядок следования битов внутри байтов, как правило, является проблемой только при выполнении побитового ввода-вывода, например при чтении потока данных, отправляемых черезпоследовательная линия.Они действительно отправляют по одному биту за раз, поэтому отправителю и получателю необходимо согласовать, отправляются ли биты слева направо или справа налево для каждого байта.

Для файлов и в памятидоступы, порядок следования битов внутри байтов не изменяется.

1 голос
/ 11 ноября 2013

Порядок битов имеет значение, когда поле использует часть байта или охватывает байты, начинающиеся или заканчивающиеся (или оба) частью пути через байт.

Пример: 2 байта данных: первые 235 (десятичные), вторые 173 (десятичные), также известные как шестнадцатеричные EB и AD.

Я хочу, чтобы битовое поле начиналось с четвертого бита, до 12-го бита. Итак, пропустите 3 бита, сделайте 9-битное целое число без знака из следующих 9 бит.

Я утверждаю, что есть 4 возможных результата:

  byteOrder,    bitOrder

* bigEndian,    bigEndian    results in hex 0BA or decimal 186
* littleEndian, littleEndian results in hex 1BD or decimal 445
* littleEndian, bigEndian    results in hex 05D or decimal 93
* bigEndian,    littleEndian results in hex 1DE or decimal 478

Я видел первые 3 из этих 4 в данных. большие, большие и маленькие, маленькие легко понять.

Подсказка для решения этой проблемы.

Если порядок байтов имеет порядковый номер, запишите байты слева направо, увеличиваясь вправо. Если порядок байтов имеет младший порядок, запишите байты справа налево, увеличиваясь влево.

1 голос
/ 14 апреля 2010

Битовые операторы в C определены для работы с значениями . Выражение 0x41U >> 5 всегда будет давать значение 2 (в двоичном виде, 010).

1 голос
/ 14 апреля 2010

Немного смущает :-). За исключением последовательной связи, термин «первый бит» не имеет значения, имеются только самые левые (наиболее значимые) и самые правые (наименее значимые) биты. Если кто-то сказал вам извлечь «первые три бита», дайте им пощечину и спросите, что они имели в виду. Даже термин «бит 0» является неоднозначным, он часто означает наименее значимый, самый правый бит (бит 2 ** 0), но почти так же часто используется для обозначения самого старшего, самого левого бита в некотором битовом поле , Какой бит является «первым» битом в байте, полностью зависит от того, что вы делаете с битами.

...