C ++ - 3 возможных значения в переменной? - PullRequest
4 голосов
/ 29 мая 2010

Мне нужно сохранить комбинацию из 30 букв, но каждая буква может быть только «0», «1» или «2».Когда я использую sizeof (myString), он возвращает 32.

Я хочу использовать эту комбинацию из 30 букв, чтобы получить доступ к строке массива, поэтому мне интересно, возможно ли использовать бул из 3 значенийкакой-то вид для хранения 1 из 3 значений.

Ответы [ 3 ]

12 голосов
/ 29 мая 2010

3 ^ 30 = 205891132094649 (~ 2E14), что меньше максимального значения 64-разрядного целого числа (~ 2E19), поэтому вы можете отобразить строки в 64-разрядные целые числа 1: 1.

Очевидный способ сделать это - обработать вашу строку как число base-3, которое будет довольно медленно конвертироваться. Намного быстрее было бы рассматривать его как основание 4, тогда преобразование может быть выполнено полностью с битовыми сдвигами (без деления / умножения модуля), это возможно, поскольку 4 ^ 30 все еще меньше, чем 2 ^ 64.

2 голосов
/ 29 мая 2010

Наименьшей единицей размера C и C ++, с которой вам приходится иметь дело (без битовых полей в структурах, которые сделают ваш код очень непрактичным), является char. Даже bool разрешается до размера char, хотя он использует только один бит. Следовательно, вы не получите никакого выигрыша от использования другого типа. Единственным возможным улучшением было бы использование типа, совершенно отличного от массива.

0 голосов
/ 29 мая 2010

В Boost есть библиотека tri-bool для 3-значных логических значений, но я не рекомендую вам использовать ее здесь. Вам лучше просто отобразить значения в 2-битные числа, упакованные в 64-битные, как упоминалось выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...