На основании ответа Майка, но с правильными числами:
a = 120 значений, b = 41 значение, c = 10 значений
Это составляет в общей сложности 49 200 уникальных значений.Байт может представлять только 256 значений, поэтому вам нужно использовать как минимум 16 бит (два байта) для представления вашего диапазона.
Теперь давайте предположим, что мы хотим использовать разные биты для представления каждого из этих чисел.(т.е. без сжатия, которое как-то смешивается):
a
удобно помещается в 7 битах, b
удобно помещается в 6 битах, а c
удобно размещается в 4 битах.(Под «удобно помещается» я подразумеваю, что это наименьшее целое число битов, в которое эти данные могут поместиться.) Это 17 битов, поэтому без применения какого-либо сжатия вы могли бы также использовать отдельный байт для каждого значения.
Теперь давайте обсудим способ вписать это в один символ, изменив размеры шагов в этих значениях.
Вы можете разделить их на два 2-битных значения (по 4 значения в каждом) и одно 4-битноезначение.Или вы можете разделить их на два 3-битных значения (по 8 значений в каждом) и одно 2-битное значение.Вы можете решить, как присвоить их своим переменным a
, b
и c
.
. Лучший способ сохранить их в C - это структура, содержащая битовые поля:
struct myvalues{
unsigned a:3;
signed b:3;
unsigned c:2;
};
//look at your compiler and platform documentation
//to make sure you can pack this properly
Затем вы можете получить доступ к полям a
, b
и c
напрямую по имени (хотя для преобразования значений вам придётся немного посчитать).
Другие языки(Java, C # и т. Д.) Не так гибки в определении типов, поэтому вам придется прибегнуть к сдвигу битов в этих языках.