Бит постановка вопроса - PullRequest
       9

Бит постановка вопроса

6 голосов
/ 03 сентября 2011

В C или C ++, по-видимому, можно ограничить количество битов, которые имеет переменная, например:

unsigned char A:1;
unsigned char B:3;

Я незнаком с тем, как это работает конкретно, поэтому ряд вопросов:

Если у меня есть класс со следующими переменными:

unsigned char A:1;
unsigned char B:3;
unsigned char C:1;
unsigned char D:3;
  1. Как на самом деле называется вышеуказанная техника?
  2. Выше класса четыре байта по размеру или один байт по размеру?
  3. Переменные обрабатываются как 1 (или 3) бит, как показано, или согласно 'unsigned char', рассматриваются как байты каждая?
  4. Есть ли способ объединить биты в централизованный байт? Так, например:

.

unsigned char MainByte;
unsigned char A:1; //Can this be made to point at the first bit in MainByte?
unsigned char B:3; //Etc etc
unsigned char C:1;
unsigned char D:3;
  1. Есть ли статья, которая более подробно освещает эту тему?
  2. Если 'A: 1' обрабатывается как целый байт, то в чем смысл / пурпур?

Не стесняйтесь упоминать любые другие соображения (например, ограничения компилятора или другие ограничения).

Спасибо.

Ответы [ 2 ]

8 голосов
/ 03 сентября 2011

Как на самом деле называется вышеуказанная техника?

Битовые поля.И вы должны использовать только int (signed, unsigned или другое) в качестве «типа», а не char.

Выше класса четыре байта в размере,или один байт в размере?

Ни то, ни другое.Вероятно, это sizeof(int), потому что компилятор генерирует объект размером с слово.Однако фактические битовые поля будут храниться в байте.Это просто потратит некоторое пространство.

Переменные обрабатываются как 1 (или 3) бит, как показано, или согласно 'unsigned char', рассматриваются как байты каждый?

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

Есть ли какое-то сочетание битов с централизованным байтом?Например:

Используйте union:

struct bits {
  unsigned A:1;
  unsigned B:3;
  unsigned C:1;
  unsigned D:3;
};

union SplitByte {
  struct bits Bits;
  unsigned char Byte[sizeof(struct bits)];
  /* the array is a trick so the two fields
     are guaranteed to be the same size and
     thus be aligned on the same boundary */
} SplitByteObj;

// access the byte
SplitByteObj.Byte[0]

// access a bitfield
SplitByteObj.Bits.B

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

Есть ли статья, которая более подробно освещает эту тему?

Не так много.Первые несколько, которые вы получите, когда вы Google, это все, что вы найдете.Они не широко используются конструкции.Лучше всего придираться к стандарту, чтобы выяснить, как именно они работают, чтобы вас не укусил странный крайний случай.Я не могу сказать вам точно, где в стандарте они указаны.

Если 'A: 1' обрабатывается как целый байт, то в чем смысл / пурпур?

Это не так, но я уже говорил об этом.

5 голосов
/ 03 сентября 2011

Это битовые поля .

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...