Quanto sono difficili da interpretare gli operatori bit per bit?
Programma i sistemi integrati. Ho praticato molto queste cose. La tua domanda collegata sulle mappe hash con il codice
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);
}
aveva perfettamente senso per me il tempo necessario per dettare ad alta voce il codice. Gli eventi descritti in bitCount
sono immediatamente chiari, ma ci vuole un minuto per capire perché conta effettivamente i bit. I commenti sarebbero grandi, però, e renderebbero la comprensione di ciò che il codice fa solo leggermente più difficile del problema di hash.
È importante distinguere tra leggere e comprendere il codice. Sono in grado di interpretare il bitCount
codice e leggere ciò che fa, ma provare perché funziona o anche se funziona richiederebbe un minuto. C'è una differenza tra la capacità di leggere il codice senza problemi e la capacità di capire perché il codice è così com'è. Alcuni algoritmi sono semplicemente difficili. La cosa del hash
Codice aveva un senso, ma il commento ha spiegato il motivo per il quale era stato fatto. Non scoraggiarti se una funzione che utilizza operatori bit per bit è difficile da capire, sono spesso usati per fare cose matematiche difficili che sarebbero difficili a prescindere dal formato.
Un'analogia
Sono abituato a queste cose. Un argomento a cui non sono abituato è regex. Di tanto in tanto mi occupo di costruire script, ma mai nel lavoro di sviluppo quotidiano.
So usare i seguenti elementi di una regex:
[]
classi di caratteri
- I
*
, .
e +
caratteri jolly
- L'inizio della stringa
^
e la fine della stringa$
- Le classi di caratteri \ d, \ w e \ s
- La bandiera / g
Questo è sufficiente per creare query semplici e molte delle query che vedo non si allontanano molto da questo.
Tutto ciò che non è in questo elenco, raggiungo un cheat sheet. Qualunque cosa, cioè, tranne {}
e ()
- Il cheat sheet non sarà sufficiente. So abbastanza di questi ragazzi per sapere che avrò bisogno di una lavagna, un manuale di riferimento e forse un collega. Puoi racchiudere alcuni pazzi algoritmi in poche righe di regex.
Per progettare una regex che richiede o suggerisce qualcosa che non è nella mia lista di elementi noti, elencherò tutte le classi di input che mi aspetto di riconoscere e le inserirò in una suite di test. Costruirò la regex lentamente e in modo incrementale, con molti passaggi intermittenti, e commetterò questi passaggi per il controllo del codice sorgente e / o li lascerò in un commento in modo che io possa capire cosa dovrebbe succedere in seguito quando si rompe. Se è nel codice di produzione, mi assicurerò che venga esaminato da qualcuno con più esperienza.
È qui che ci si trova con operatori bit per bit?
Quindi vuoi essere ben arrotondato?
Secondo la mia stima, se sei in grado di interpretare il codice come questo estraendo un pezzo di carta o andando alla lavagna ed eseguendo le operazioni manualmente, ti qualifichi come arrotondato. Per qualificarti come un buon programmatore a tutto tondo nell'area delle operazioni bit a bit, dovresti essere in grado di fare quattro cose:
Essere in grado di leggere e scrivere le operazioni comuni in modo fluido
Per un programmatore di applicazioni, le operazioni comuni con operatori bit a bit includono gli operatori di base di |
e &
per impostare e cancellare flag. Questo dovrebbe essere facile. Dovresti essere in grado di leggere e scrivere cose come
open('file', O_WRONLY | O_APPEND | O_CREAT );
// Use an OR operator ^ here and ^ here to set multiple flags
senza rallentare (supponendo che tu sappia cosa significano le bandiere ).
Essere in grado di leggere operazioni più complesse con alcuni lavori
Contare i bit molto velocemente nel tempo O (log (n)) senza rami, assicurando che il numero di collisioni negli hashCode possa differire di un importo limitato e analizzare indirizzi e-mail , numeri di telefono o HTML con regex sono problemi difficili. È ragionevole per chiunque non sia un esperto in queste aree raggiungere la lavagna, è irragionevole non essere in grado di iniziare a lavorare per capire.
Essere in grado di scrivere alcuni algoritmi complessi con molto lavoro
Se non sei un esperto, non dovresti aspettarti di essere in grado di fare cose complesse e difficili. Tuttavia, un buon programmatore dovrebbe essere in grado di farlo lavorando continuamente. Fallo abbastanza e presto diventerai un esperto :)