Основная идея
К сожалению, в C. нет способа сделать это. Вы можете создавать массивы из 1 байта, 2 байта и т. Д., Но вы не можете создавать области битов.
Лучшее, что вы можете сделать, это написать новую библиотеку для себя, которая выглядит так, как будто вы имеете дело с массивами из 2 битов, но на самом деле выполняет много тяжелой работы. Точно так же, как строковые библиотеки дают вам функции, которые работают с «строками» (которые в C являются просто массивами), вы будете создавать новую библиотеку, которая работает с «битовыми массивами» (которые в действительности будут массивами целых чисел, с несколькими специальными функциями для работы с ними, как если бы они были массивами битов.
ПРИМЕЧАНИЕ. Если вы новичок в C и не изучили идеи «создания новой библиотеки / модуля» или концепцию «абстракции», то я бы рекомендовал ознакомиться с ними, прежде чем продолжить этот проект. Понимание их важнее IMO, чем оптимизация вашей программы, чтобы она занимала немного меньше места.
Как реализовать эту новую "библиотеку" или модуль
Для ваших нужд я бы создал новый модуль под названием «2-битный массив», который будет экспортировать функции для работы с 2-битными массивами по мере необходимости.
В нем будет несколько функций, которые имеют дело с установкой / чтением битов, так что вы можете работать с ним, как если бы у вас был настоящий массив битов (у вас фактически будет массив целых чисел или что-то еще, но модуль будет сделать так, чтобы у вас был массив битов).
При использовании этого модуля хотелось бы что-то вроде этого:
// This is just an example of how to use the functions in the twoBitArray library.
twoB my_array = Create2BitArray(size); // This will "create" a twoBitArray and return it.
SetBit(twoB, 5, 1); // Set bit 5 to 1 //
bit b = GetBit(twoB, 5); // Where bit is typedefed to an int by your module.
Что модуль фактически сделает, так это реализует все эти функции, используя обычные старые массивы целых чисел.
Например, функция GetBit()
для GetBit(my_arr, 17)
вычислит, что это 1-й бит в 4-м целом числе вашего массива (очевидно, в зависимости от sizeof(int)
), и вы вернете его с помощью побитового операции.