Wie schwer sind bitweise Operatoren zu interpretieren?
Ich programmiere eingebettete Systeme. Ich habe dieses Zeug viel geübt. Ihre verknüpfte Frage zu Hash-Maps mit dem 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);
}
machte für mich in etwa so lange Sinn, wie es dauern würde, den Code laut zu diktieren. Die in beschriebenen Ereignisse bitCount
sind sofort klar, aber es dauert eine Minute, um herauszufinden, warum es tatsächlich Bits zählt. Kommentare wären jedoch großartig und würden das Verständnis dessen, was der Code tut, nur geringfügig erschweren als das Hash-Problem.
Es ist wichtig, zwischen dem Lesen und dem Verstehen des Codes zu unterscheiden. Ich kann den bitCount
Code interpretieren und ablesen, was er tut, aber nachweisen, warum er funktioniert oder sogar, dass er funktioniert, würde eine Minute dauern. Es gibt einen Unterschied zwischen dem reibungslosen Lesen von Code und dem Erkennen, warum der Code so ist, wie er ist. Einige Algorithmen sind einfach schwer. Das Was des hash
Codes ergab einen Sinn, aber der Kommentar erklärte, warum das, was getan wurde. Lassen Sie sich nicht entmutigen, wenn eine Funktion mit bitweisen Operatoren schwer zu verstehen ist. Oft werden sie verwendet, um schwierige mathematische Aufgaben auszuführen, die unabhängig vom Format schwierig sind.
Eine Analogie
Ich bin an dieses Zeug gewöhnt. Ein Thema, an das ich nicht gewöhnt bin, ist Regex. Ich setze mich gelegentlich mit ihnen in Build-Skripten auseinander, aber niemals in der täglichen Entwicklungsarbeit.
Ich kann die folgenden Elemente eines regulären Ausdrucks verwenden:
[]
Zeichenklassen
- Der
*
, .
und +
Platzhalter
- Der Anfang der Zeichenfolge
^
und das Ende der Zeichenfolge$
- Die Zeichenklassen \ d, \ w und \ s
- Das Flag / g
Dies reicht aus, um einfache Abfragen zu erstellen, und viele der Abfragen, die ich sehe, weichen nicht weit davon ab.
Alles, was nicht auf dieser Liste steht, greife ich nach einem Spickzettel. Alles, außer {}
und ()
- Der Spickzettel wird nicht ausreichen. Ich weiß gerade genug über diese Typen, um zu wissen, dass ich ein Whiteboard, ein Referenzhandbuch und vielleicht einen Kollegen brauchen werde. Sie können einige verrückte Algorithmen in ein paar kurze Zeilen Regex packen.
Um einen regulären Ausdruck zu entwerfen, der alles erfordert oder vorschlägt, was nicht in meiner Liste der bekannten Elemente enthalten ist, liste ich alle Klassen von Eingaben auf, die ich zu erkennen erwarte, und füge sie einer Testsuite hinzu. Ich werde den regulären Ausdruck langsam und schrittweise mit vielen intermittierenden Schritten erstellen und diese Schritte der Quellcodeverwaltung zuweisen und / oder sie in einem Kommentar hinterlassen, damit ich nachvollziehen kann, was später passieren sollte, wenn es kaputt geht. Wenn es sich um Seriencode handelt, stelle ich sicher, dass er von jemandem mit mehr Erfahrung überprüft wird.
Arbeiten Sie hier mit bitweisen Operatoren?
Du willst also gut gerundet sein?
Wenn Sie in der Lage sind, den Code wie folgt zu interpretieren, indem Sie ein Blatt Papier herausziehen oder zum Whiteboard gehen und die Vorgänge manuell ausführen, werden Sie als gut gerundet eingestuft. Um sich im Bereich der bitweisen Operationen als ein guter, abgerundeter Programmierer zu qualifizieren, sollten Sie in der Lage sein, vier Dinge zu tun:
Gemeinsame Operationen flüssig lesen und schreiben können
Für einen Anwendungsprogrammierer umfassen gemeinsame Operationen mit bitweisen Operatoren die Grundoperatoren von |
und &
zum Setzen und Löschen von Flags. Das sollte einfach sein. Sie sollten in der Lage sein, Dinge wie zu lesen und zu schreiben
open('file', O_WRONLY | O_APPEND | O_CREAT );
// Use an OR operator ^ here and ^ here to set multiple flags
ohne langsamer zu werden (vorausgesetzt, Sie wissen, was die Flags bedeuten ).
Sie können komplexere Operationen mit einigem
Aufwand lesen. Zählen Sie Bits sehr schnell in O (log (n)) - Zeit ohne Verzweigungen. Stellen Sie dabei sicher, dass sich die Anzahl der Kollisionen in hashCodes um einen begrenzten Betrag unterscheidet, und analysieren Sie E-Mail-Adressen , Telefonnummern oder HTML mit einem regulären Ausdruck sind schwierige Probleme. Es ist für jeden vernünftig, der in diesen Bereichen kein Experte ist, nach dem Whiteboard zu greifen. Es ist unvernünftig, nicht in der Lage zu sein, mit dem Verstehen zu beginnen.
In der Lage sein, einige komplexe Algorithmen mit viel Arbeit zu schreiben
Wenn Sie kein Experte sind, sollten Sie nicht erwarten, komplexe und schwierige Aufgaben ausführen zu können. Ein guter Programmierer sollte es jedoch schaffen, indem er kontinuierlich daran arbeitet. Tu das genug, und du wirst bald ein Experte sein :)