На ваш вопрос нет прямого ответа: как и любой другой язык программирования, Rust имеет базовый набор правил c для макетов типов. Это связано с тем, что (большинство) реальных процессоров не могут адресовать отдельные биты, требуют определенных выравниваний при обращении к памяти, имеют правила относительно того, как работает арифметика указателей c и c. et c.
Например, если вы создаете тип только из двух битов, вам все равно понадобится 8-битный байт для представления этого типа, потому что просто нет способа обратиться к двум отдельным битам на большинстве операционных кодов процессора; также нет способа получить адрес такого типа, потому что адресация работает, по крайней мере, на уровне байтов. Более полезную информацию об этом можно найти здесь , раздел 2, The Anatomy of a Type
. Имейте в виду, что не теряющий битовый тип, о котором вы думаете, должен соответствовать всем упомянутым там правилам.
Это совершенно разумный подход, чтобы представлять то, что вы хотите сделать, например, как один, в виде обертки u128
и реализовать все арифметические c поверх этого типа. Другой, более общий c подход - использовать Vec<u8>
. Вы всегда будете делать относительно большое количество бит-маскировок, косвенных и т. Д.
Посмотрите на rust_decimal
или подобные ящики, также может быть хорошей идеей.