Quanto è difficile interpretare gli operatori bit a bit?
Programma programmi embedded. Ho praticato molto questa roba. 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);
}
mi è sembrato perfetto nel tempo necessario a dettare il codice ad alta voce. Gli eventi descritti in bitCount
sono immediatamente chiari, ma ci vuole un minuto per capire perché conta effettivamente bit. I commenti sarebbero grandiosi, tuttavia, e renderebbero la comprensione di ciò che il codice fa solo leggermente più difficile del problema dell'hash.
È importante fare la distinzione tra leggere e capire il codice. Sono in grado di interpretare il codice bitCount
e di leggere quello che fa, ma dimostrando il motivo per cui funziona o anche che funzioni potrebbe richiedere un minuto. C'è una differenza tra l'essere in grado di leggere il codice senza intoppi ed essere in grado di ingannare il motivo per cui il codice è così com'è. Alcuni algoritmi sono semplicemente difficili. Il cosa del codice hash
aveva senso, ma il commento spiegava perché ciò che veniva fatto. Non scoraggiarti se una funzione che usa operatori bit a bit è difficile da capire, sono spesso usati per fare cose matematiche difficili che sarebbero difficili a prescindere dal formato.
Un'analogia
Sono abituato a questa roba. Un argomento a cui non sono abituato è regex. Mi occupo occasionalmente di script di compilazione, ma mai nel lavoro di sviluppo quotidiano.
So come usare i seguenti elementi di un'espressione regolare:
-
[]
classi di caratteri
- I caratteri
*
, .
e +
- Inizio della stringa
^
e fine della stringa $
- Le classi di carattere \ d, \ w, \ s
- Il flag / g
Questo è sufficiente per creare query semplici e molte delle query che vedo non si discostano molto da questo.
Qualunque cosa non sia in questa lista, cerco un foglio dei trucchi. Qualunque cosa, eccetto {}
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 magari un collega. Puoi impacchettare alcuni algoritmi pazzi in poche righe brevi di espressioni regolari.
Per progettare un'espressione regolare che richiede o suggerisce qualcosa che non è nella mia lista di elementi conosciuti, ho intenzione di elencare tutte le classi di input che mi aspetto di riconoscere e metterli in una suite di test. Elaborerò l'espressione regolare lentamente e in modo incrementale, con un sacco di passaggi intermittenti, e commetterò questi passaggi al controllo del codice sorgente e / o li lascerò in un commento, così posso capire cosa sarebbe dovuto succedere più tardi quando si rompe. Se è in codice di produzione, farò in modo che venga esaminato da qualcuno con più esperienza.
È qui che ti trovi con operatori bit a bit?
Quindi vuoi essere ben arrotondato?
Secondo me, se sei in grado di interpretare il codice come questo tirando fuori un pezzo di carta o andando alla lavagna e eseguendo manualmente le operazioni, sei qualificato a tutto tondo. Per qualificarsi 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 operazioni comuni fluidamente
Per un programmatore di applicazioni, le operazioni comuni con operatori bit a bit includono gli operatori di base di |
e &
per impostare e deselezionare i 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 i flag ).
-
Essere in grado di leggere operazioni più complesse con un po 'di lavoro
I bit di conteggio sono molto veloci nel tempo O (log (n)) senza rami, garantendo che il numero di collisioni in hashCode possa differire di una quantità limitata e analisi degli indirizzi email , numeri di telefono o HTML con una regex sono problemi difficili. È ragionevole per chiunque non sia un esperto in queste aree di raggiungere la lavagna, è irragionevole non poter 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 funzionare continuamente. Fallo abbastanza e sarai presto un esperto :)