Хранить 8 bool в одном
Однажды читал статью в которой засказывали что тип данных bool занимает в памяти в 8 больше чем ему нужно для хранения 0/1. Сейчас вспомнил об этом и захотел сделать, к сожалению ту статью найти уже не могу и чего-то похожего тоже. Посидел подолбался с побитовым сдвигом и другими такими операциями и начал сомневаться что такое вообще возможно. Если кто-нибудь знает или раскажите или киньте ссылку на источник.
Ответы (2 шт):
Так для того, что вы желаете, существуют битовые флаги.
Например, вместо следующего кода:
bool bFlag1 = true;
bool bFlag2 = false;
bool bFlag3 = true;
....
if (bFlag1) {...}
if (!bFlag2) {...}
if (bFlag2 || bFlag3) {...}
Можете использовать этот, эквивалентный, но с упакованными в один байт bool'ами:
#define FLAG1 1
#define FLAG2 2
#define FLAG3 4
char cFlags = FLAG1 | FLAG3;
...
if (cFlags&FLAG1) {...}
if (!(cFlags&FLAG2)) {...}
if (cFlags&(FLAG2|FLAG3)) {...}
В языке С для работы с битами внутри байта существует более простая возможность- битовые union типы. Ими очень часто пользуются разаработчики по для "железа", где нужно читать битовые поля из регистров и т.д.
Подробно можете об этом прочитать в разделе "Битовые поля" книги Подбельского В.В. "Программирование на языке С", стр 320. Элементарный пример:
#include <stdio.h>
// Расписываем битовые поля 16-битного регистра
union bit_register {
unsigned short bit0:1; // Самый младший бит слова
unsigned short bit1:1; // Следующий бит слова
unsigned short f_1:10; // Поле из 10 бит
unsigned short filler:4; // Оставшиеся 4 бита
};
int main(int argc, char *argv[]) {
union bit_register r1, r2;
r1.bit0 = 1;
r2.bit1 = r1.bit0;
printf("Битовое поле второго регистра: %d\n", r2.bit1);
}