He visto esto un par de veces, pero me parece que el uso del desplazamiento en modo bit a la izquierda dificulta la legibilidad. ¿Por qué se usa? ¿Es más rápido que solo multiplicar por 2?¿Hay alguna ventaja de usar '<< 1' en lugar de '* 2'?
Respuesta
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.
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).
Si está utilizando un viejo compilador de C, es preferible usar bitwise. Para legibilidad puedes comentar tu código sin embargo.
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.
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
+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). –
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.
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.
- 1. En C++, ¿qué es más rápido? (2 * i + 1) o (i << 1 | 1)?
- 2. <? o <? php --- ¿hay alguna diferencia?
- 3. <? Php en lugar de <?
- 4. ¿Hay alguna ventaja de usar null primero en PHP?
- 5. ¿Hay alguna ventaja al usar selectores muy específicos en CSS?
- 6. ¿Qué hace "2 <& 1" redirigir en Bourne shell?
- 7. char_x <(char_y + 1) == char_x <= char_y?
- 8. Ventaja de usar "x * = -1". sobre "x * = -1"?
- 9. ¿Cuál es la verdadera ventaja de devolver ICollection <T> en lugar de una lista <T>?
- 10. qué colección de C# usar en lugar de List <KeyValuePair <string, double >>?
- 11. Los resultados de Java son diferentes para (int) Math.pow (2, x) y 1 << x
- 12. ¿Por qué debería usar <ARGV> o <> en lugar de <STDIN> en Perl?
- 13. Valida que un valor esté en un cierto rango, p. 1 <= val <= 2
- 14. ¿Podemos usar <body> en lugar de #container div?
- 15. ¿Hay alguna razón para no usar <=> (seguro nulo es igual a operador) en mysql en lugar de =?
- 16. ¿Alguna vez el valor será 0 después de cambiar por "x << = 1" repetidamente?
- 17. En PHP, ¿hay alguna ventaja de usar forward_static_call_array() en lugar de call_user_func_array() cuando se llama dinámicamente a un método estático?
- 18. ¿Hay alguna manera de anular el operador << en Ruby?
- 19. Cython: para i de 1 <= i <N
- 20. ¿Los compiladores modernos optimizan la operación x * 2 a x << 1?
- 21. ¿Hay una pena de dos a usar <nav> elementos en un <header>
- 22. ¿Hay alguna razón para usar SGML en lugar de XML?
- 23. ¿Hay alguna ventaja en un If/Else anidado en lugar de Else If?
- 24. Cómo usar <s:property> etiqueta en <s:text> en puntales 2
- 25. ¿Hay alguna manera fácil de convertir Future <Future<T>> en Future <T>?
- 26. ¿Hay alguna ventaja de usar palabra clave volátil en contraste para usar la clase Interbloqueado?
- 27. JSF 2.0: ¿Existe alguna ventaja al utilizar DataModel <T> sobre la lista <T> para aplicaciones CRUD
- 28. ¿Hay alguna manera de crear elementos dinámicamente <rich:tab>?
- 29. ¿Hay alguna buena razón para usar <rtexprvalue> falso</ rtexprvalue> en las etiquetas JSP?
- 30. HTML: ¿hay alguna forma de hacer clic <td> o <tr> etiquetas?
Esto es fácil de probar. Solo pruébalo. –
cómo? ¿Usando 'tiempo'? –