Significado de cero inicial en entero literal

Estoy estudiando (ANSI) C por The C Programming Language (2da edición) .

Este es un fragmento de código de 2.10 operadores de asignación y expresiones :

1 /* bitcount() counts the number of 1-bits in its integer argument */ 2 int bitcount(unsigned x) 3 { 4 int b; 5 for (b = 0; x != 0; x >>= 1) 6 if (x & 01) 7 b++; 8 return b; 9 } 

Estoy confundido por qué x & 01 está escrito en la línea 6 en lugar de x & 1 o x & 0x1 ? ¿Es necesario 0 antes de 1 ?

El 01 también se podría escribir 1, o 0x1.

 01 = Octal Constant Base 8 (1 Decimal) 1 = Decimal Constant. Base 10 0x1 = Hexadecimal Constant. Base 16 (1 Decimal). 

Cuando se escribió el libro, Base 8 (octal) estaba presente en la progtwigción de computadoras existente.

Un 0 inicial convierte una constante en un valor octal (base 8).

En este caso, no es diferente de 1 o 0x1 porque todos tendrán la misma representación binaria de 000...001 . Las personas a menudo usan constantes hexadecimales para distinguir que un valor se está utilizando como una máscara de bits u otro valor en el sentido de los bits en la actualidad. En el pasado, las constantes octales se usaban con más frecuencia para el mismo propósito.

 0x1 = hex constant = 1 0X1 = hex constant = 1 01 = octal contant = 1 1 = decimal constant = 1 1U = unsigned decimal constant = 1 

De hecho, ” 01 ” es distinto de 1 y 0x1 en principio . ” 01 ” está codificado en octal. Kernighan / Ritchie probablemente valoran la facilidad con la que se puede convertir de octal a binario para este problema en particular.