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.