2009-09-21 15 views

Respuesta

17

Es más rápido en compiladores antiguos que no optimizan las llamadas * 2 al emitir una instrucción de desplazamiento a la izquierda. Esa optimización es realmente fácil de detectar y cualquier compilador decente ya lo hace.

Si afecta la legibilidad, entonces no lo use. Siempre escriba su código de la manera más clara y concisa primero, luego, si tiene problemas de velocidad, retroceda y perfile y realice optimizaciones manuales.

2

Para algunas arquitecturas, el cambio de bit es más rápido que la multiplicación. Sin embargo, cualquier compilador que valga la pena optimizará * 2 (o cualquier multiplicación por una potencia de 2) a un desplazamiento de bit izquierdo (cuando un cambio de bit sería más rápido).

1

Si está utilizando un viejo compilador de C, es preferible usar bitwise. Para legibilidad puedes comentar tu código sin embargo.

22

Debe usar * cuando se está multiplicando, y < < cuando está cambiando de bit. Son matemáticamente equivalentes, pero tienen diferentes significados semánticos. Si está construyendo un campo de bandera, por ejemplo, use el desplazamiento de bit. Si está calculando un total, use la multiplicación.

+0

muy buen punto. Si desea mover los bits un lugar hacia la izquierda, use '<< 1'. si quieres hacer un número dos veces más grande, usa '* 2'. Mismo efecto, pero mucho más claro para lo que estás usando el número. – nickf

+2

+1. Exprese su ** intención ** en su código, no intente adivinar en segundo lugar el compilador (a menos que haya perfilado el código y determinado que hacerlo de una forma u otra hace una diferencia significativa en el rendimiento). –

6

Se usa cuando le preocupan los bits individuales de los datos con los que está trabajando. Por ejemplo, si desea establecer el byte superior de una palabra a 0x9A, usted no escribir

n |= 0x9A * 256 

Usted escribiría:

n |= 0x9A << 8 

Esto hace que sea más claro que el que está trabajando bits, en lugar de los datos que representan.

2

Para facilitar la lectura de los valores utilizados como campos de bits:

enum Flags { UP  = (1<<0), 
      DOWN  = (1<<1), 
      STRANGE = (1<<2), 
      CHARM = (1<<3), 
      ... 

que creo que es preferible, ya sea '= 1, ..., = 2, ... = 4' o '= 1, .. . = 2, = 2 * 2, ... = 2 * 3 'especialmente si tiene 8+ banderas.

Cuestiones relacionadas