Con respecto a la primera mitad:
>>
es un cambio de bit a bit a la derecha.
Así desplazamiento de un valor numérico 3 bits a la derecha es lo mismo que dividir por 8 y int
ing el resultado.
Aquí es una buena referencia para los operadores y su precedencia: http://web.cs.mun.ca/~michael/c/op.html
La segunda parte de su pregunta implica que el operador &
, que es un AND de bits. El ejemplo es ANDing i
y un número que deja todos los bits establecidos excepto los 3 menos significativos. Eso es esencialmente lo mismo que sucede cuando tienes un número, lo divide por 8, almacena el resultado como un entero, luego multiplica ese resultado por 8.
La razón por la que esto es así es porque se divide entre 8 y se almacena como entero es lo mismo que cambiar de bit a los 3 lugares correctos, y multiplicar por 8 y almacenar el resultado en un int es lo mismo que cambiar de bit a los 3 lugares a la izquierda.
Por lo tanto, si está multiplicando o dividiendo por una potencia de 2, como 8, y va a aceptar el truncamiento de bits que ocurre cuando almacena ese resultado en int
, el cambio de bit es más rápido operacionalmente Esto se debe a que el procesador puede omitir el algoritmo de multiplicar/dividir y simplemente ir directamente a los bits de desplazamiento, lo que implica unos pocos pasos.
'i >> 3' es/solo puede ser más rápido que' i/8' en un compilador que es * absolutamente horrible * en las optimizaciones. No se preocupe, escriba el código más claro ;-) –
Quien le haya dicho eso probablemente todavía esté viviendo en los * días de gloria * del montaje de la escritura. Convertir cosas como 'i/8' a' i >> 3' se llama [reducción de la resistencia] (https://secure.wikimedia.org/wikipedia/en/wiki/Strength_reduction) y es una de las optimizaciones más básicas realizadas por compiladores. – Praetorian