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