2011-07-02 15 views
6

Wikipedia, la única y verdadera fuente de conocimiento, afirma:¿Las operaciones bit a bit siguen siendo prácticas?

En la mayoría de los microprocesadores más viejos, bit a bit operaciones son ligeramente más rápido que operaciones de suma y resta y por lo general significativamente más rápido que multiplicación y división operaciones. En arquitecturas modernas, este no es el caso: bit a bit operaciones son por lo general la misma velocidad como adición (aunque sigue siendo más rápido que la multiplicación ).

¿Hay alguna razón práctica para aprender a realizar operaciones de bits o ahora es algo que se aprende para la teoría y la curiosidad?

+1

wikipedia "verdadera fuente de conocimiento"? parece un poco exagerado ... – ShinTakezou

+11

@ShinTakezou: se llama sarcasmo. – geekosaur

+1

No puedo obtener pistas sobre el hecho de que es sarcasmo, excepto por el hecho de que creo que el reclamo está exagerado, y dado que conozco personas que piensan que wikipedia es realmente una gran fuente de conocimiento y que siempre es correcto, y No conozco la opinión real de OP y PoV al respecto, tengo que tomar en serio el reclamo. Me alegra saber que es sarcasmo. – ShinTakezou

Respuesta

12

Las operaciones de bit a bit son dignas de estudio porque tienen muchas aplicaciones. Es no su uso principal para sustituir las operaciones aritméticas. La criptografía, los gráficos por computadora, las funciones hash, los algoritmos de compresión y los protocolos de red son solo algunos ejemplos en los que las operaciones bit a bit son extremadamente útiles.

Las líneas que citó del artículo de Wikipedia simplemente trataron de dar algunas pistas sobre la velocidad de las operaciones de bit a bit. Lamentablemente, el artículo no proporciona algunos buenos ejemplos de aplicaciones.

4

Son útiles para llegar a comprender cómo binaria "trabaja"; De otra manera no. De hecho, diría que incluso si los hacks bitwise son más rápidos en una arquitectura determinada, el trabajo del compilador es hacer uso de ese hecho, no del tuyo. Escribe lo que quieres decir.

+0

+1 para "es el trabajo del compilador". Dicho esto, a veces lo que quieres decir es que | juntas un montón de máscaras de bits, luego & el resultado con un valor para ver si se establecen varias banderas. –

+0

@Sherm: Claro, pero entonces no "significa" sumas o restas, por lo que las operaciones bit a bit son semánticamente correctas (y de nuevo, es tarea del compilador encontrar la mejor manera de hacerlo). – geekosaur

+1

código no siempre se compila, dependiendo de la plataforma y el idioma, por lo que si el rendimiento aún es una preocupación, las operaciones a nivel de bit pueden ser útiles para saber y usar – ricosrealm

1

Por supuesto (para mí) la respuesta es sí. El hecho de que hoy en día una instrucción add sea tan rápida como or o and solo significa que ... pero or no es add y la usará cuando lo necesite de todos modos (no por supuesto, sino solo para realizar or , ...). Las mejoras en la velocidad de las instrucciones como agregar, divisiones y demás solo significa que ahora puede usarlas y estar menos preocupado por el impacto en el rendimiento, pero es verdad ahora como en el pasado que no va a cambiar un solo add a varios bitwise operaciones!

1

El único caso en el que tiene sentido utilizar ellos es si en realidad estás usando sus números bitvectors. Por ejemplo, si está modelando algún tipo de hardware y las variables representan registros.

Si desea realizar operaciones aritméticas, utilizar los operadores aritméticos.

11

operaciones bit a bit siguen siendo útiles. Por ejemplo, se pueden usar para crear "banderas" usando una sola variable, y guardar en el número de variables que usaría para indicar varias condiciones. En cuanto al rendimiento en operaciones aritméticas, es mejor dejar que el compilador realice la optimización (a menos que seas algún tipo de gurú).

+0

Este es otro buen uso. – ricosrealm

+2

+1 para usarlo como indicadores – CamelCamelCamel

+0

Esto es indispensable para cosas como protocolos o configuración de hardware, así como una fuente potencial de mejoras de rendimiento mucho mayores de lo que implicaría el recuento de ciclos de operación, ya que puede reducir drásticamente los requisitos de ancho de banda de memoria de un código. –

1

Es cierto que en la mayoría de los casos cuando se multiplica un número entero por una constante que resulta ser una potencia de dos, el compilador lo optimiza para usar el bit-shift. Sin embargo, cuando el cambio también es una variable, el compilador no puede deducirlo, a menos que use explícitamente la operación de cambio.

+0

Es cierto. Por otro lado, algunos procesadores se multiplican más rápido de lo que pueden realizar un cambio en una cantidad variable de bits. Solo escribe lo que es legible. Lo más probable es que el crítico 10% de tu código esté en otro lugar de todos modos ... –

0

Trabajar con direcciones IPv4 frecuentemente requiere operaciones de bits para descubrir si la dirección de un igual está dentro de una red enrutable o debe reenviarse a una puerta de enlace, o si el par es parte de una red permitida o denegada por reglas de firewall. Se requieren operaciones de bits para descubrir la dirección de difusión de una red.

Trabajar con direcciones IPv6 requiere las mismas operaciones fundamentales a nivel de bit, pero como son muy largas, no estoy seguro de cómo se implementan. Apostaría dinero a que todavía se implementan utilizando los operadores de bits en piezas de los datos, dimensionados adecuadamente para la arquitectura.

1

Divertido nadie vio la mención de la matriz ctype [] en C/C++, también implementada en Java. Este concepto es extremadamente útil en el procesamiento del lenguaje, especialmente cuando se usan alfabetos diferentes, o cuando se analiza una oración.

ctype [] es una matriz de 256 enteros cortos, y en cada entero, hay bits que representan diferentes tipos de caracteres. Por ejemplo, ctype [; A '] - ctype [' Z '] tienen bits configurados para mostrar que son letras mayúsculas del alfabeto; ctype ['0'] - ctype ['9'] tiene bits configurados para mostrar que son numéricos. Para ver si un carácter x es alfanumérico, puede escribir algo como 'if (ctype [x] & (UC | LC | NUM))' que es algo más rápido y mucho más elegante que escribir 'if (' A '= x < = 'Z' || .... '.

Una vez que empiezas a pensar en modo bit, encuentras muchos lugares para usarlo. Por ejemplo, tenía dos búferes de texto. Escribí uno al otro, reemplazando todas las ocurrencias de FINDstring con REPLACEstring como fui. Luego, para el siguiente par de buscar-reemplazar, simplemente cambié los índices del buffer, así que siempre escribía desde el buffer [in] al buffer [out]. 'in' comenzó como 0, 'out' como 1. Después de completar una copia, simplemente escribí 'in^= 1; out^= 1;'. Y después de manejar todas las sustituciones acabo de escribir buffer [out] en el disco, sin necesidad de saber qué fue 'out' en ese momento time.

Si crees que esto es de bajo nivel, ¡considera que ciertos errores mentales como el deja-vu y su gemelo jamais-vu son causados ​​por errores cerebrales!

Cuestiones relacionadas