Jak trudne są interpretacje operatorów bitowych?
Programuję systemy osadzone. Dużo ćwiczyłem to. Twoje powiązane pytanie dotyczące map skrótów z kodem
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);
}
miało dla mnie idealny sens, tak długo, jak długo dyktujemy na głos kod. Zdarzenia opisane w bitCount
są natychmiast jasne, ale ustalenie, dlaczego tak naprawdę liczy bity, zajmuje minutę. Komentarze byłyby jednak świetne i sprawiłyby, że zrozumienie tego, co robi kod, jest tylko trochę trudniejsze niż problem z skrótem.
Ważne jest, aby wprowadzić rozróżnienie między czytaniem a zrozumieniem kodu. Potrafię zinterpretować bitCount
kod i odczytać, co robi, ale udowodnienie, dlaczego działa, a nawet, że działa, zajmie chwilę. Istnieje różnica między umiejętnością płynnego odczytu kodu a umiejętnością sprawdzania, dlaczego kod jest taki, jaki jest. Niektóre algorytmy są po prostu trudne. Co z hash
kod sens, ale komentarz wyjaśnia dlaczego co zostało zrobione. Nie zniechęcaj się, jeśli funkcja wykorzystująca operatory bitowe jest trudna do zrozumienia, często są używane do robienia skomplikowanych zadań matematycznych, które byłyby trudne bez względu na format.
Analogia
Jestem przyzwyczajony do tego. Jednym z tematów, do których nie jestem przyzwyczajony, jest regex. Od czasu do czasu radzę sobie z nimi przy skryptach kompilacji, ale nigdy w codziennych pracach programistycznych.
Wiem, jak korzystać z następujących elementów wyrażenia regularnego:
[]
klasy postaci
- Te
*
, .
oraz +
symbole wieloznaczne
- Początek
^
i koniec łańcucha$
- Klasy znaków \ d, \ w i \ s
- Flaga / g
To wystarczy, aby stworzyć proste zapytania, a wiele zapytań, które widzę, nie oddala się od tego.
Cokolwiek nie ma na tej liście, sięgam po ściągawki. Wszystko, z wyjątkiem {}
i ()
- Ściągawka nie wystarczy. Wiem wystarczająco dużo o tych facetach, aby wiedzieć, że będę potrzebować tablicy, podręcznika referencyjnego, a może współpracownika. Możesz spakować kilka szalonych algorytmów w kilka krótkich wierszy wyrażenia regularnego.
Aby zaprojektować wyrażenie regularne, które wymaga lub sugeruje cokolwiek, co nie znajduje się na mojej liście znanych elementów, zamierzam wymienić wszystkie klasy danych wejściowych, które spodziewam się rozpoznać i umieścić je w pakiecie testowym. Zamierzam tworzyć regex powoli i przyrostowo, z wieloma przerywanymi krokami, i przekażę te kroki kontroli źródła i / lub zostawię je w komentarzu, aby zrozumieć, co miało się stać później, gdy się zepsuje. Jeśli jest w kodzie produkcyjnym, upewnię się, że zostanie sprawdzony przez kogoś z większym doświadczeniem.
Czy to jest miejsce w przypadku operatorów bitowych?
Więc chcesz być dobrze zaokrąglony?
Według mojej oceny, jeśli potrafisz zinterpretować, jak działa taki kod, wyciągając kawałek papieru lub przechodząc do tablicy i ręcznie wykonując operacje, kwalifikujesz się jako dobrze zaokrąglony. Aby zakwalifikować się jako dobry, wszechstronny programista w dziedzinie operacji bitowych, powinieneś być w stanie zrobić cztery rzeczy:
Płynnie czytać i zapisywać typowe operacje.
Dla programisty aplikacji typowe operacje z operatorami bitowymi obejmują podstawowe operatory |
oraz &
ustawianie i usuwanie flag. To powinno być łatwe. Powinieneś być w stanie czytać i pisać takie rzeczy
open('file', O_WRONLY | O_APPEND | O_CREAT );
// Use an OR operator ^ here and ^ here to set multiple flags
bez spowalniania (zakładając, że wiesz, co oznaczają flagi ).
Być w stanie odczytać bardziej złożone operacje przy pewnej pracy
Liczenie bitów naprawdę szybko w czasie O (log (n)) bez rozgałęzień, upewniając się, że liczba kolizji w hashCodes może się różnić o ograniczoną liczbę, oraz parsowanie adresów e-mail , numerów telefonów lub HTML z wyrażeniem regularnym to trudne problemy. Rozsądne jest, aby każdy, kto nie jest ekspertem w tych obszarach, sięgnął po tablicę, nie można nierozsądnie zacząć rozumieć.
Umiejętność pisania skomplikowanych algorytmów przy dużym nakładzie pracy
Jeśli nie jesteś ekspertem, nie powinieneś oczekiwać, że będziesz w stanie wykonywać skomplikowane i trudne zadania. Jednak dobry programista powinien być w stanie to zrobić poprzez ciągłą pracę. Zrób to wystarczająco, a wkrótce będziesz ekspertem :)