Как я получаю число битов в типе char
?
Я знаю о CHAR_BIT
от climits
. Это описано как» урожаи макроса, максимальное значение для числа битов раньше представляло объект символа типа. «в Ссылке Dikumware C. Я понимаю, что означает число битов в a char
, не он?
Я могу получить тот же результат с std::numeric_limits
так или иначе? std::numeric_limits
возвраты 7
правильно, но к сожалению, потому что это значение уважает со знаком из 8-разрядного символа здесь …
Если вы хотите быть слишком конкретным, вы можете сделать следующее:
sizeof(char) * CHAR_BIT
Если вы знаете, что определенно собираетесь сделать sizeof char, это немного излишне, так как sizeof(char) гарантированно равен 1.
Но если вы перейдете к другому типу, например wchar_t, это будет важно.
CHAR_BIT
- это, по определению, количество битов в представлении объекта типа [ подписанный / беззнаковый] char
.
numeric_limits <> :: digits
- количество битов без знака в представлении значения данного типа.
Какой вам нужен?
Если вы ищете количество битов в представлении объекта, то правильный подход состоит в том, чтобы взять размер
типа и умножить его на CHAR_BIT
(конечно, есть нет смысла умножать на sizeof
в конкретном случае типов char
, поскольку их размер всегда равен 1, и поскольку CHAR_BIT
по определению уже содержит то, что вам нужно).
Если вы говорите о представлении значений, то numeric_limits <>
- это то, что вам нужно.
Для типа unsigned char
битовый размер представления объекта ( CHAR_BIT
) гарантированно будет таким же, как битовый размер представления значения, поэтому вы можете использовать numeric_limits
и CHAR_BIT
взаимозаменяемо, но это может быть сомнительным с концептуальной точки зрения.
При загрузке этих библиотек могут возникнуть небольшие накладные расходы, если они динамически связаны. Это обычно будет крошечная, крошечная доля времени, которое ваша программа тратит на выполнение.
Однако, когда все загружено, накладных расходов не будет.
Если вы не хотите использовать все повышения, то не используйте. Он модульный, поэтому можно использовать нужные детали и игнорировать остальные.
-121--110â5-Избыточный код не делает работу процессора более медленной. Все, что он делает, это сидит там, занимая немного памяти.
Если вы статически связываетесь и ваш линкер вообще разумен, то он будет включать только те функции, которые вы фактически используете в любом случае.
-121--110â7-Глядя на архив фрагментов для этого кода здесь , вот адаптированная версия, я не утверждаю этот код:
int countbits(char ch){ int n = 0; if (ch){ do n++; while (0 != (ch = ch&(ch-1))); } return n; }
Надеюсь, это поможет, С уважением, Том.
Неэффективный способ:
char c;
int bits;
for ( c = 1, bits = 0; c; c <<= 1, bits++ )
;
printf( "bits = %d\n", bits );