¿Qué tan difícil es interpretar los operadores bit a bit?
Programo sistemas embebidos. He practicado mucho estas cosas. Su pregunta vinculada sobre mapas hash con el código
static int hash(int h) {
// This function ensures that hashCodes that differ only by
// constant multiples at each bit position have a bounded
// number of collisions (approximately 8 at default load factor).
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
}
tenía mucho sentido para mí aproximadamente el tiempo que llevaría dictar el código en voz alta. Los eventos descritos en bitCount
son inmediatamente claros, pero lleva un minuto descubrir por qué realmente cuenta bits. Sin embargo, los comentarios serían geniales y harían que entender lo que hace el código sea un poco más difícil que el problema de hash.
Es importante hacer la distinción entre leer y comprender el código. Puedo interpretar el bitCount
código y leer lo que hace, pero probar por qué funciona o incluso si funciona tomaría un minuto. Hay una diferencia entre poder leer el código sin problemas y poder entender por qué el código es como es. Algunos algoritmos son simplemente difíciles. El qué del hash
código tenía sentido, pero el comentario explicaba por qué lo que se estaba haciendo. No se desanime si una función que utiliza operadores bit a bit es difícil de entender, a menudo se utilizan para hacer cosas matemáticas difíciles que serían difíciles sin importar el formato.
Una analogía
Estoy acostumbrado a estas cosas. Un tema al que no estoy acostumbrado es la expresión regular. Los trato ocasionalmente en scripts de compilación, pero nunca en el trabajo de desarrollo diario.
Sé cómo usar los siguientes elementos de una expresión regular:
[]
clases de personajes
- Los
*
, .
y +
comodines
- El inicio de la cadena
^
y el final de la cadena.$
- Las clases de caracteres \ d, \ w y \ s
- La bandera / g
Esto es suficiente para elaborar consultas simples, y muchas de las consultas que veo no se alejan mucho de esto.
Cualquier cosa que no esté en esta lista, busco una hoja de trucos. Cualquier cosa, es decir, excepto {}
y ()
... La hoja de trucos no será suficiente. Sé lo suficiente sobre estos muchachos para saber que voy a necesitar una pizarra, un manual de referencia y tal vez un compañero de trabajo. Puede empaquetar algunos algoritmos locos en unas pocas líneas cortas de expresiones regulares.
Para diseñar una expresión regular que requiera o sugiera algo que no esté en mi lista de elementos conocidos, voy a enumerar todas las clases de entradas que espero reconocer y ponerlas en un conjunto de pruebas. Voy a elaborar la expresión regular de forma lenta e incremental, con muchos pasos intermitentes, y comprometeré estos pasos para controlar la fuente y / o dejarlos en un comentario para que pueda entender lo que se suponía que sucedería más tarde cuando se rompa. Si está en el código de producción, me aseguraré de que sea revisado por alguien con más experiencia.
¿Es aquí donde estás con operadores bit a bit?
¿Entonces quieres estar bien redondeado?
En mi opinión, si puede interpretar qué código hace esto sacando un trozo de papel o yendo a la pizarra y ejecutando las operaciones manualmente, califica como bien redondeado. Para calificar como un buen programador completo en el área de operaciones bit a bit, debe poder hacer cuatro cosas:
Poder leer y escribir operaciones comunes de manera fluida
Para un programador de aplicaciones, las operaciones comunes con operadores bit a bit incluyen los operadores básicos de |
y &
para establecer y borrar banderas. Esto debería ser fácil. Deberías poder leer y escribir cosas como
open('file', O_WRONLY | O_APPEND | O_CREAT );
// Use an OR operator ^ here and ^ here to set multiple flags
sin disminuir la velocidad (suponiendo que sepa lo que significan las banderas ).
Sea capaz de leer operaciones más complejas con algo de trabajo.
Contar bits realmente rápido en tiempo O (log (n)) sin ramificaciones, asegurando que el número de colisiones en hashCodes puede diferir en una cantidad limitada, y analizar direcciones de correo electrónico , números de teléfono o HTML con una expresión regular son problemas difíciles. Es razonable que cualquier persona que no sea un experto en estas áreas alcance la pizarra, no es razonable no poder comenzar a trabajar para comprender.
Sé capaz de escribir algunos algoritmos complejos con mucho trabajo.
Si no eres un experto, no debes esperar poder hacer cosas complejas y difíciles. Sin embargo, un buen programador debería poder hacerlo trabajando continuamente. Haz esto lo suficiente, y pronto serás un experto :)