Насколько сложно интерпретировать побитовые операторы?
Я программирую встроенные системы. Я много тренировался с этим. Ваш связанный вопрос о хэш-картах с кодом
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);
}
имело смысл для меня примерно столько, сколько потребуется, чтобы диктовать код вслух. События, описанные в bitCount
, сразу понятны, но требуется минута, чтобы понять, почему он действительно считает биты. Тем не менее, комментарии были бы хорошими и позволили бы понять, что делает код, лишь немного сложнее, чем проблема с хешем.
Важно проводить различие между чтением и пониманием кода. Я могу интерпретировать bitCount
код и прочитать, что он делает, но доказать, почему он работает или даже работает, потребуется минута. Есть разница между способностью читать код гладко и умением понимать, почему код такой, какой он есть. Некоторые алгоритмы просто сложны. « Что из hash
кода» имело смысл, но комментарий объяснил, почему это делается. Не расстраивайтесь, если функцию, использующую побитовые операторы, трудно понять, они часто используются для выполнения сложных математических задач, которые были бы сложными независимо от формата.
Аналогия
Я привык к этому. Одна тема, к которой я не привык, это регулярные выражения. Я имею дело с ними время от времени на сценарии сборки, но никогда в повседневной работе разработчиков.
Я знаю, как использовать следующие элементы регулярного выражения:
[]
классы персонажей
- В
*
, .
и +
подстановочные знаки
- Начало строки
^
и конец строки$
- Классы символов \ d, \ w и \ s
- Флаг / g
Этого достаточно для создания простых запросов, и многие из запросов, которые я вижу, не уходят далеко от этого.
Что-нибудь не в этом списке, я достаю шпаргалку. Все что угодно, кроме {}
и ()
- шпаргалки не хватит. Я достаточно знаю об этих парнях, чтобы знать, что мне понадобится доска, справочное руководство и, возможно, коллега. Вы можете упаковать несколько сумасшедших алгоритмов в несколько коротких строк регулярного выражения.
Чтобы разработать регулярное выражение, которое требует или предлагает что-либо, чего нет в моем списке известных элементов, я собираюсь перечислить все классы входных данных, которые я ожидаю распознать, и поместить их в набор тестов. Я собираюсь обработать регулярное выражение медленно и постепенно, с большим количеством прерывистых шагов, и зафиксировать эти шаги для контроля исходного кода и / или оставить их в комментарии, чтобы я мог понять, что должно было случиться позже, когда оно сломается. Если это в рабочем коде, я собираюсь сделать так, чтобы он был проверен кем-то с большим опытом.
Это где вы с побитовыми операторами?
Так ты хочешь быть хорошо округленным?
По моим оценкам, если вы можете интерпретировать, что код делает, вытаскивая лист бумаги или переходя к доске и выполняя операции вручную, вы квалифицируетесь как хорошо округленный. Чтобы квалифицироваться как хороший всесторонний программист в области побитовых операций, вы должны быть в состоянии сделать четыре вещи:
Умение легко читать и записывать общие операции.
Для программиста приложений общие операции с побитовыми операторами включают основные операторы |
и &
для установки и сброса флагов. Это должно быть легко. Вы должны быть в состоянии читать и писать такие вещи, как
open('file', O_WRONLY | O_APPEND | O_CREAT );
// Use an OR operator ^ here and ^ here to set multiple flags
без замедления (при условии, что вы знаете, что означают флаги ).
Быть способным читать более сложные операции с некоторой работой.
Очень быстрый подсчет битов за O (log (n)) времени без веток, обеспечение того, что число коллизий в hashCodes может отличаться на ограниченную величину, и анализ адресов электронной почты , телефонных номеров или HTML с регулярным выражением - сложные проблемы. Для тех, кто не является экспертом в этих областях, имеет смысл обратиться к доске, поэтому неразумно начинать работать, чтобы понять.
Уметь писать сложные алгоритмы с большой работой.
Если вы не эксперт, вы не должны ожидать, что сможете делать сложные и сложные вещи. Тем не менее, хороший программист должен быть в состоянии сделать это, работая над ним постоянно. Сделай этого достаточно, и ты скоро станешь экспертом :)