Что такое «битовое заполнение» или «битовое заполнение»? - PullRequest
0 голосов
/ 17 октября 2019

Я не хочу приставать к вам с этим, но я просто не могу найти где-нибудь в Интернете хорошо описанное объяснение того, что на самом деле означает "битовое заполнение", а также ни в каком ответе для потоков, связанных с заполнением битами. здесь, на StackOverflow.

Я также искал ISO 9899-1990 для него, в котором упоминается "битовая заливка", но совсем не объясняется, как мне это нужно.

Единственный контент в Интернетея обнаружил, что это было здесь , где было дано только одно смехотворно краткое объяснение одного предложения:

заполнение битами:

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

Некоторые источники идентифицируют битовое заполнение как тип вставки битов .

Что это по крайней мере какая-то информация, но для меня недостаточно объяснений. Я не совсем понимаю, что это значит. Это также относится к термину «вставка битов» .


Когда я смотрю на относительный тег здесь на StockOverflow для « padding », описывается заполнениекак:

Дополнительное пространство вставляется в структуры памяти для достижения выравнивания адреса - или - дополнительное пространство между фреймом и содержимым элемента HTML - или - дополнительные пробелы или нули при печати значений с использованием форматирования печатитакие команды, как, в C, printf * -семейство функций.

Справочная информация:

Я часто нахожу термин "битовое заполнение" в отношении типов данных, но непонять, что это такое, и что оно делает с этими.

Большое спасибо за любой тематический ответ.

Ответы [ 4 ]

3 голосов
/ 17 октября 2019

Я часто нахожу термин «заполнение битами» в отношении типов данных, но не понимаю, что это такое, и что он делает с ними.

Суть этогоэто они "впустую" пространство. Я говорю «впустую», потому что, хотя биты-отступы делают объект больше, он может значительно облегчить работу с ним (что означает более быструю), а небольшие потери пространства могут привести к значительному увеличению производительности. В некоторых случаях это важно, потому что ЦП не может работать с объектами такого размера.

Допустим, у вас есть структура наподобие (все числа являются лишь примером, разные платформы могут иметь разные значения):

struct foo
{
    short a; // 16 bits
    char  b; // 8 bits 
};

и машина, с которой вы работаете, читает 32 бита данных за одну операцию чтения. Чтение одного foo не является проблемой, поскольку весь объект помещается в этот 32-битный блок. Что становится проблемой, когда у вас есть массив. Важно помнить о массивах, потому что они смежные, между элементами нет места. Это просто один объект, за которым сразу следует другой. Итак, если у вас есть массив, подобный

foo array[10]{};

С этим первый foo объект находится в 32-битном сегменте. Следующий элемент массива будет находиться в первом 32-разрядном сегменте и во втором 32-разрядном сегменте. Это означает, что элемент a находится в двух отдельных сегментах. Некоторые процессоры могут сделать это (за плату), а другие процессоры просто рухнут, если вы попытаетесь это сделать. Чтобы решить обе эти проблемы, компилятор добавит биты заполнения в конец foo, чтобы заполнить его размер. Это означает, что foo фактически становится

struct foo
{
    short a; // 16 bits
    char  b; // 8 bits 
    char  _; // 8 bits of padding
};

И теперь процессору легко обрабатывать foo объекты самостоятельно или в массиве. Это не требует дополнительной работы, и вы добавили только 8 бит на объект. Вам понадобится много объектов, чтобы это начало иметь значение на современном компьютере.

В некоторых случаях вам также необходимо заполнение между членами типа из-за невыровненного доступа. Допустим, у вас есть

struct bar
{
    char c; // 8 bits
    int  d; // 32 bits
};

Теперь bar имеет ширину 40 бит и d чаще, чем не, будет снова сохраняться в двух разных. Чтобы исправить это, компилятор добавляет биты заполнения между c и d, такими как

struct bar
{
    char    c; // 8 bits
    char _[3]; // 24 bits
    int     d; // 32 bits
};

, и теперь d гарантированно входит в одно 32-битное ведро.

1 голос
/ 17 октября 2019

Итак, представьте, что у вас есть 8-битное число, это uint8_t, и его значение установлено на 4. Это, вероятно, будет храниться как a = 0000 0100. Теперь, допустим, вы хотите преобразовать это в 16-битное число. Что случилось бы? Вы должны присвоить некоторые значения «новым» битам в этом номере. Как бы вы их назначили? Вы не можете случайным образом назначать нули или единицы, значение исходной переменной изменится. В зависимости от архитектуры и т. Д. Вам нужно значение pad с дополнительными битами. В моем случае это означало бы добавление еще восьми дополнительных нулей перед исходным MSB (самый значащий бит), что делает наше число a = 0000 0000 0000 0100.

Значение по-прежнему равно 4, но теперь вы можете назначить что угодно в диапазоне [0, 2 ^ 16) вместо диапазона [0, 2 ^ 8).

1 голос
/ 17 октября 2019

битовое заполнение:
Битовое заполнение - это добавление одного или нескольких дополнительных битов к блоку передачи или хранения, чтобы он соответствовал стандартному размеру.

Поскольку опубликованное вами определение уже верное, я попытаюсь объяснить на примере:

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

Я уверен, что могут быть лучшие примеры этого в нескольких контекстах. Кто угодно, не стесняйтесь редактировать и / или дополнять ответ новыми улучшениями или примерами.

Надеюсь, это поможет!

0 голосов
/ 17 октября 2019

Битовое заполнение может использоваться в нескольких контекстах. Два распространенных примера - сеть и шифрование. Я считаю, что контекст шифрования более актуален.

Заполнение используется в шифровании, чтобы затруднить расшифровку сообщений, которые имеют общую часть. Если известно, что несколько сообщений имеют одинаковый префикс (например, «привет»), это облегчает взлом ключа. «Заполняя» сообщение битовым полем переменной длины, становится намного сложнее взломать ключ.

Говорят, что британская разведка смогла ускорить анализ сообщения Enigma, потому что немецкийначинали свое сообщение с того же заголовка.

Для более точного технического описания: https://en.wikipedia.org/wiki/Padding_(cryptography) Ищите раздел о блочном шифре и заполнении битами

...