Задать вопрос
Daniil_the_Fool
@Daniil_the_Fool

Возможно ли создание своего типа данных — массива бит?

Доброго вечера.
Использую си. Пытаюсь реализовать тип данных который является массивом 5 элементов со значением 0 или 1.
Что-то навроде такой конструкции:
  1. typedef enum[4]{1,0}byte[];
  2. byte name = (0,0,0,0,0);

по идее 0 - 0,0,0,0,0 и 1,1,1,1,1 - 31 занимает соответственно один байт т.е как я понял менше нельзя.
Не работает; может кто-нибудь подсказать что следует делать чтобы сделать тип - массив или это безнадежная идея?
  • Вопрос задан
  • 283 просмотра
Подписаться 1 Средний 4 комментария
Решения вопроса 1
@res2001
Developer, ex-admin
В п.1 написана какая-то синтаксически не корректная хрень, смысла которой я понять не могу.

Массив бит или битовое поле можно реализовать, конечно. Фактически это будет массив байт (или любого другого беззнакового целого), можно его спрятать в typedef и реализовать над ним несколько операций отдельными функциями.
Например в С++ есть специализация std::vector<bool>, которая для экономии памяти использует внутри битовый массив, а не массив bool, как можно было бы подумать.

Объявляете байт и работаете с отдельными битами с помощью битовых операций. Если есть необходимость в более широком битовом поле, то можно все унифицировать: при инициализации задаете размер битового поля, вычисляете по заданному размеру размер массива (можно использовать uint8_t, uint16_t, uint32_t или uint64_t - любой беззнаковый целочисленный тип оптимальной длинны), выделяете память для массива.
Операции над битовым полем:
1. создание/удаление
2. установить/снять бит по номеру
3. проверить установлен ли бит по номеру
4. опционально вычисление количества установленных бит и/или проверка пустое ли битовое поле.

Все это не трудно сделать. Можно даже заморочится и сделать на макросах универсальный вариант, где тип данных для массива будет выбираться в зависимости от размера битового поля. Не уверен, что это надо на самом деле, вполне достаточно использовать массив uint8_t для всех размеров битового поля.

Объявить переменную размером в один бит (или размером не кратным 8 бит) нельзя, потому что в современных компьютерах минимально адресуемая единица памяти - 1 байт. Была бы 1 бит - можно было бы объявлять переменные размером в 1(2,3, 11, ...) бит. Это архитектурное ограничение компьютеров, а не языка программирования.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы