Битовые поля

Битовые поля

Битовое поле — в программировании число, занимающее некоторый набор битов, напрямую не адресуемый процессором. Например: при 8-битном байте первые два поля протокола

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

Компиляторы, как правило, ограничивают работу с битовыми полями только извлечением значения битового поля и записью значения в битовое поле, а само битовое поле воспринимается как беззнаковое число. Реальный порядок следования битовых полей в структуре есть системно-зависимым: в одних компиляторах битовые поля могут быть расположены начиная с младших битов, а в других — со старших.

Содержание

Операции над многобитовыми полями

Пусть в одном байте находятся три битовых поля: 1-битовые a и b, 2-битовое c и 4-битовое d, то есть x = a + b \cdot 2^1 + c \cdot 2^2 + d \cdot 2^4.

 [старший бит] d d d d c c b a [младший бит]

Например: при a=1, b=0, c=2=102, d=5=01012 получаем x=010110012=89.

Сборка одного числа из битовых полей

Двоичные компьютеры обычно имеют команды побитового сдвига, которые позволяют быстро умножать на степени двойки — 2, 4, 8 и т. д. Вместо сложения можно применить команду логического «ИЛИ». Таким образом, число x можно собрать и по-другому:

x = (d << 4) | (c << 2) | (b << 1) | a

Извлечение битового поля

Для извлечения битового поля нужно провести две операции:

  1. Умножить операцией логического «И» число на битовую маску — число, у которого в соответствующих разрядах единицы, а в остальных нули.
  2. Провести побитовый сдвиг вправо.

То есть:

c = (x & 00001100b) >> 2

Либо:

  1. Провести побитовый сдвиг вправо.
  2. Умножить операцией логического «И» число на битовую маску соответствующей длины.
c = (x >> 2) & 00000011b

Для младшего поля побитовый сдвиг не нужен, то есть:

a = x & 00000001b

Для старшего поля побитовый сдвиг сам по себе, без умножения на маску, очистит x от ненужных битов — то есть,

c = x >> 5

Замена битового поля

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

Например, если нам нужно заменить d, то

xnew = (x & 00001111b) | (d << 4)

Операции над однобитовыми полями

Поля a и b имеют длину 1 бит — это позволяет работать с ними несколько другими средствами.

Проверка отдельного бита

Для проверки надо побитово умножить x операцией «И» на маску, у которой одна единица — в соответствующей позиции. Если получился 0, бит равен 0.

b = ((x & 00000010b) ≠ 0)

Проверка, равен ли единице хотя бы один бит из нескольких:

a_or_b = ((x & 00000011b) ≠ 0)

Проверка, равны ли единице все биты из нескольких:

a_and_b = ((x & 00000011b) == 00000011b)

Установка битов

Для этого надо сложить операцией «ИЛИ» x с маской, у которой единицы в соответствующих позициях. Например, чтобы включить бит a:

x1 = x | 00000001b

Чтобы включить и a, и b:

x2 = x | 00000011b

Снятие битов

Чтобы снять один или несколько битов, надо сложить x операцией «И» с маской, у которой в соответствующих позициях нули. В частности, чтобы выключить бит b, нужно дать команду:

x3 = x & 11111101b

Переключение битов

Для переключения битов (с 0 на 1, с 1 на 0) надо сложить x командой «Исключающее ИЛИ» с маской, у которой в соответствующих позициях единицы. Например, бит b переключается так:

x4 = x ^ 00000010b

Операции над знаковыми полями в дополнительном коде

Существуют два способа хранения отрицательных целых чисел — знаковый бит и дополнительный код. В подавляющем большинстве современных машин применяется второй. При записи отрицательных чисел дополнительным кодом имеем:

-1 = 11111111b
-2 = 11111110b
-3 = 11111101b
-4 = 11111100b
и т. д.

Считаем, что поля c и d имеют именно такой формат. Тогда поле c может хранить числа от −2=102 до 1=012, а поле d — от −8=10002 до 7=01112.

Сборка и замена чисел

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

x = (d << 4) + ((c & 00000011b) << 2) + (b << 1) + a

Извлечение чисел

Для извлечения чисел требуется сдвинуть поле на нужное количество битов вправо, заодно размножив знаковый бит. Например, для этого можно воспользоваться арифметическим сдвигом. Если x имеет длину 8 битов, то

c = (x << 4 ) >>a 6
d = x >>a 4

Внимание! В языке программирования >> обозначается арифметический сдвиг, знаком >>> — простой.

Если арифметического сдвига нет, то…

c1 = x >> 2
если (c1 & 00000010b ≠ 0)
  то c = c1 | 0x11111100b
  иначе c = c1 & 0x00000011b

Wikimedia Foundation. 2010.

Игры ⚽ Нужно решить контрольную?

Полезное


Смотреть что такое "Битовые поля" в других словарях:

  • Поле класса — или атрибут (переменная член, data member, class field, instance variable) в объектно ориентированном программировании  переменная, связанная с классом или объектом. Все данные объекта хранятся в его полях. Доступ к полям осуществляется по… …   Википедия

  • Битовое поле — Битовое поле  в программировании число, занимающее некоторый набор битов, напрямую не адресуемый процессором. Например: при 8 битном байте первые два поля протокола IP  версия и IHL  будут битовыми полями. На машинах с 32 битным… …   Википедия

  • D (язык программирования) — У этого термина существуют и другие значения, см. D. D Семантика: мультипарадигменный: императивное, объектно ориентированное, обобщённое программирование Тип исполнения: компилятор Появился в: 1999 Автор(ы) …   Википедия

  • ARINC 429 — стандарт на компьютерную шину для применения в авионике. Разработан фирмой ARINC. Стандарт описывает основные функции и необходимые физические и электрические интерфейсы для цифровой информационной системы самолёта. Сегодня, ARINC 429 является… …   Википедия

  • Автоматное программирование — Автоматное программирование  это парадигма программирования, при использовании которой программа или её фрагмент осмысливается как модель какого либо формального автомата. В зависимости от конкретной задачи в автоматном программировании… …   Википедия

  • Список структур данных — …   Википедия

  • Дополнительный код (представление числа) — У этого термина существуют и другие значения, см. Дополнительный код. Дополнительный код (англ. two’s complement, иногда twos complement) наиболее распространённый способ представления отрицательных целых чисел в компьютерах. Он позволяет… …   Википедия

  • 8-битный цвет — Глубина цвета битовое изображение 8 битная шкала серого 8 битный цвет 15/16 bit: Highcolor 24 bit: Truecolor 30/36/48 bit: Deep Color См. также Цветовая модель RGB Цветовая модель CMYK Цветовая палитра Видимое излучение Цвета в Web (Цвета HTML) 8 …   Википедия

  • ExFAT — Разработчик Microsoft Файловая система Расширенная таблица размещения файлов (англ. Extended File Allocation Table) Дата представления Ноябрь 2006 (Windows Embedded CE 6.0) Метка тома 0x07 (MBR) EBD0A0A2 B9E5 4433 87C0 68B6B72699C7 (GP …   Википедия

  • exFAT — Разработчик Microsoft Файловая система Расширенная таблица размещения файлов (англ. Extended File Allocation Table) Дата представления Ноябрь 2006 (Windows Embedded CE 6.0) Метка тома 0x07 (MBR) EBD0A0A2 B9E5 4 …   Википедия


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»