Quelle est la difficulté d'interprétation des opérateurs de bits?
Je programme des systèmes embarqués. J'ai beaucoup pratiqué ce genre de choses. Votre question liée sur les cartes de hachage avec le code
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);
}
Cela me paraissait parfaitement logique aussi longtemps qu'il faudrait pour dicter le code à voix haute. Les événements décrits dans bitCount
sont immédiatement clairs, mais il faut une minute pour comprendre pourquoi il compte réellement les bits. Les commentaires seraient bien, cependant, et rendraient la compréhension de ce que le code ne fait que légèrement plus difficile que le problème du hash.
Il est important de faire la distinction entre lire et comprendre le code. Je peux interpréter le bitCount
code et lire ce qu'il fait, mais il faudrait une minute pour prouver pourquoi cela fonctionne ou même si cela fonctionne. Il y a une différence entre être capable de lire le code en douceur et être capable de comprendre pourquoi le code est ce qu'il est. Certains algorithmes sont simplement difficiles. Le quoi du hash
code avait un sens, mais le commentaire expliquait pourquoi ce qui était fait. Ne vous découragez pas si une fonction utilisant des opérateurs au niveau des bits est difficile à comprendre, ils sont souvent utilisés pour effectuer des calculs mathématiques complexes, ce qui serait difficile quel que soit le format.
Une analogie
Je suis habitué à ce genre de choses. Un sujet auquel je ne suis pas habitué est la regex. Je traite avec eux de temps en temps sur des scripts de construction, mais jamais dans le travail de développement quotidien.
Je sais comment utiliser les éléments suivants d'une regex:
[]
classes de personnage
- Les
*
, .
et +
wildcards
- Le début de la chaîne
^
et la fin de la chaîne$
- Les classes de caractères \ d, \ w et \ s
- Le drapeau / g
C'est assez pour créer des requêtes simples, et beaucoup de requêtes que je vois ne s'en écartent pas.
Tout ce qui ne figure pas sur cette liste est une triche. Tout ce qui est, à l' exception {}
et ()
- La feuille de triche ne sera pas suffisant. J'en connais juste assez sur ces gars-là pour savoir que je vais avoir besoin d'un tableau blanc, d'un manuel de référence et peut-être d'un collègue. Vous pouvez intégrer des algorithmes délirants dans quelques lignes de regex.
Pour concevoir une expression rationnelle qui requiert ou suggère tout ce qui ne figure pas dans ma liste d'éléments connus, je vais énumérer toutes les classes d'entrées que je compte reconnaître et les placer dans une suite de tests. Je vais construire la regex lentement et progressivement, avec de nombreuses étapes intermittentes, et valider ces étapes pour le contrôle de la source et / ou les laisser dans un commentaire afin que je puisse comprendre ce qui était censé se passer plus tard quand elle se cassera. Si c'est dans le code de production, je vais m'assurer que celui-ci sera examiné par une personne plus expérimentée.
Est-ce là où vous en êtes avec les opérateurs au niveau des bits?
Donc, vous voulez être bien arrondi?
À mon avis, si vous êtes capable d'interpréter ce code comme celui-ci en tirant un morceau de papier ou en allant au tableau blanc et en parcourant les opérations manuellement, vous êtes qualifié comme complet. Pour être considéré comme un bon programmeur complet dans le domaine des opérations au niveau des bits, vous devez être capable de faire quatre choses:
Être capable de lire et d'écrire des opérations courantes de manière fluide
Pour un programmeur d'applications, les opérations courantes avec des opérateurs au niveau des bits incluent les opérateurs de base de |
et &
pour définir et effacer des indicateurs. Cela devrait être facile. Vous devriez être capable de lire et d’écrire des choses comme
open('file', O_WRONLY | O_APPEND | O_CREAT );
// Use an OR operator ^ here and ^ here to set multiple flags
sans ralentir (en supposant que vous sachiez ce que signifient les drapeaux ).
Pouvoir lire des opérations plus complexes avec un peu de travail
Compter les bits très rapidement en temps O (log (n)) sans branches, en s'assurant que le nombre de collisions dans hashCodes peut différer d'un montant lié, et en analysant les adresses e-mail , numéros de téléphone ou HTML avec une regex sont des problèmes difficiles. Il est raisonnable que quiconque n'est pas un expert dans ces domaines cherche à obtenir le tableau blanc, il est déraisonnable de ne pas pouvoir commencer à travailler pour comprendre.
Etre capable d'écrire des algorithmes complexes avec beaucoup de travail
Si vous n'êtes pas un expert, vous ne devriez pas vous attendre à être capable de faire des choses complexes et difficiles. Cependant, un bon programmeur devrait pouvoir le faire en travaillant continuellement. Faites cela assez souvent et vous serez bientôt un expert :)