Позвольте мне начать с некоторой предыстории:
Под «трибуллом» я понимаю переменную, которая может содержать одно из следующих значений: true
, false
или null
.
В вопросе Копируя массив целочисленных значений против указателей на булевые , ОП хотел получить массив триболов (более или менее), который был бы как можно меньше.
Используя «немного» самого основного бит-фу, я придумал решение, в котором использовалось 2 бита на трибул и позволяло хранить массив OP из 64 трибоулов в 16 байтах, и это нормально.
Механика трибула, которую я использовал, была проста, например:
Но потом я подумал ... Алгоритмическое определение «бита» таково:
бит - это количество информации, которое указывает, какое из двух равновероятных событий должно произойти.
Очевидно, что значение истина / ложь имеет размер в 1 бит. Два значения true-false в целом имеют размер в 2 бита.
А как же наш концептуальный трибул?
Моя точка зрения: С точки зрения размера содержащейся информации, трибул больше 1 бита, но меньше 2 бит .
(Ничего из вышеперечисленного не является формальным доказательством, но я считаю, что мы можем согласиться с тем, что насчет «размера» трибул должен быть строго больше 1 бита и строго меньше 2.)
Мой вопрос:
Как программно воспользоваться преимуществом того факта, что трибул имеет меньше информации, чем 2 бита, и реализовать его в программном обеспечении (c, c ++?) массив из N трибоулов, объем памяти которых будет меньше, чем N / 4
байтов для некоторого N?
Да, я понимаю, что такая реализация не является t действительно дружественен к оборудованию и будет работать медленнее, чем любое обычное решение с избыточностью (как те, которые представлены в вопросе OP). Давайте просто оптимизируем пространство, а не эффективность.
Очевидно, что эта реализация требует другого представления трибула, чем пара булевых (что само по себе является избыточным, как описано ранее). Теория утверждает, что этой цели можно достичь, и мне нравится видеть реальную реализацию. Есть идеи?