Получите число битов в символе

Как я получаю число битов в типе char?

Я знаю о CHAR_BIT от climits. Это описано как» урожаи макроса, максимальное значение для числа битов раньше представляло объект символа типа. «в Ссылке Dikumware C. Я понимаю, что означает число битов в a char, не он?

Я могу получить тот же результат с std::numeric_limits так или иначе? std::numeric_limits::digits возвраты 7 правильно, но к сожалению, потому что это значение уважает со знаком из 8-разрядного символа здесь …

8
задан mkluwe 12 February 2010 в 10:56
поделиться

4 ответа

Если вы хотите быть слишком конкретным, вы можете сделать следующее:

sizeof(char) * CHAR_BIT

Если вы знаете, что определенно собираетесь сделать sizeof char, это немного излишне, так как sizeof(char) гарантированно равен 1.

Но если вы перейдете к другому типу, например wchar_t, это будет важно.

10
ответ дан 5 December 2019 в 06:09
поделиться

CHAR_BIT - это, по определению, количество битов в представлении объекта типа [ подписанный / беззнаковый] char .

numeric_limits <> :: digits - количество битов без знака в представлении значения данного типа.

Какой вам нужен?

Если вы ищете количество битов в представлении объекта, то правильный подход состоит в том, чтобы взять размер типа и умножить его на CHAR_BIT (конечно, есть нет смысла умножать на sizeof в конкретном случае типов char , поскольку их размер всегда равен 1, и поскольку CHAR_BIT по определению уже содержит то, что вам нужно).

Если вы говорите о представлении значений, то numeric_limits <> - это то, что вам нужно.

Для типа unsigned char битовый размер представления объекта ( CHAR_BIT ) гарантированно будет таким же, как битовый размер представления значения, поэтому вы можете использовать numeric_limits :: digits и CHAR_BIT взаимозаменяемо, но это может быть сомнительным с концептуальной точки зрения.

14
ответ дан 5 December 2019 в 06:09
поделиться

При загрузке этих библиотек могут возникнуть небольшие накладные расходы, если они динамически связаны. Это обычно будет крошечная, крошечная доля времени, которое ваша программа тратит на выполнение.

Однако, когда все загружено, накладных расходов не будет.

Если вы не хотите использовать все повышения, то не используйте. Он модульный, поэтому можно использовать нужные детали и игнорировать остальные.

-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;
}

Надеюсь, это поможет, С уважением, Том.

2
ответ дан 5 December 2019 в 06:09
поделиться

Неэффективный способ:

char c;
int bits;
for ( c = 1, bits = 0; c; c <<= 1, bits++ )
   ;
printf( "bits = %d\n", bits );
1
ответ дан 5 December 2019 в 06:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: