2010-02-11 16 views
7

¿Cómo obtengo el número de bits en el tipo char?Obtener el número de bits en el char

Sé el CHAR_BIT de climits. Esto se describe como »La macro proporciona el valor máximo para el número de bits utilizados para representar un objeto de tipo char.« En Dikumware's C Reference. Entiendo que eso significa la cantidad de bits en un char, ¿no es así?

¿Puedo obtener el mismo resultado con std::numeric_limits de alguna manera? std::numeric_limits<char>::digits vuelve 7 correctamente, pero por desgracia, ya que este valor respeta el signo numérico del carbón de leña de 8 bits aquí ...

Respuesta

10

Si quieres ser demasiado específico, puede hacer esto:

sizeof(char) * CHAR_BIT 

Si usted sabe que está Definitivamente va a hacer el tamaño de char, es un poco exagerado ya que sizeof (char) está garantizado para ser 1.

Pero si te mueves a un tipo diferente como wchar_t, eso será importante.

1

una forma no eficiente:

char c; 
int bits; 
for (c = 1, bits = 0; c; c <<= 1, bits++) 
    ; 
printf("bits = %d\n", bits); 
12

CHAR_BIT es, por definición, el número de bits en la representación objeto de tipo [signed/unsigned] char.

numeric_limits<>::digits es la cantidad de bits sin signo en la representación de valores del tipo especificado.

¿Cuál necesita?

Si usted está buscando el número de bits en la representación del objeto, entonces el enfoque correcto es tomar el sizeof del tipo y se multiplica por CHAR_BIT (por supuesto, no tiene sentido en la multiplicación por sizeof en el caso concreto de char tipos, ya que su tamaño es siempre 1, y dado que CHAR_BIT por definición ya contiene lo que necesita).

Si está hablando de representación de valores, entonces numeric_limits<> es el camino a seguir.

Para unsigned char tipo del tamaño de bitios de la representación del objeto (CHAR_BIT) se garantiza que sea el mismo que el tamaño de bitios de la representación de valores, por lo que se puede utilizar numeric_limits<unsigned char>::digits y CHAR_BIT indistintamente, pero esto podría ser cuestionable desde el punto de conceptual ver.

+0

Bueno, olvidé mencionar por qué no estaba contento con el uso de CHAR_BIT: me gustaría obtener el número de bits en algún código de plantilla, y numeric_limits <> encajaría mejor en mi primera vista. Pero el enfoque de usar sizeof (char) * CHAR_BIT como lo menciona R Samuel Klatchko hace el trabajo. – mkluwe

2

En cuanto a los fragmentos de archivo para este código here, aquí es una versión adaptada, no pretendo este código:

 
int countbits(char ch){ 
    int n = 0; 
    if (ch){ 
     do n++; 
     while (0 != (ch = ch&(ch-1))); 
    } 
    return n; 
} 

Espero que esto ayude, Saludos cordiales, Tom .

Cuestiones relacionadas