Наскільки важко побитові оператори інтерпретувати?
Я програмую вбудовані системи. Я багато цього практикував. Ваше пов’язане питання про хеш-карти з кодом
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
- Прапор / г
Цього достатньо для створення простих запитів, і багато запитів, які я бачу, не відстають від цього.
Все, що не в цьому списку, я добираюся до шпаргалки. Що-небудь, тобто, крім {}
і ()
- обману не вистачить. Мені достатньо відомо про цих хлопців, щоб знати, що мені знадобиться дошка, довідковий посібник і, можливо, колега. Можна спакувати кілька шалених алгоритмів у кілька коротких рядків регулярного виразів.
Щоб створити регулярний вираз, який вимагає або пропонує щось, що не в моєму списку відомих елементів, я перерахую всі класи вхідних даних, які, як я очікую, розпізнаю, і поставлю їх у тестовий набір. Я збираюся виробити регулярний вираз повільно і поступово, з великою кількістю переривчастих кроків, і виконую ці кроки для контролю джерела та / або залиште їх у коментарі, щоб я міг зрозуміти, що повинно було відбутися пізніше, коли воно порушиться. Якщо це у виробничому коді, я переконуюсь, що його перевірять хтось із більшим досвідом.
Це там, де ви перебуваєте з побітними операторами?
Отже, ви хочете бути добре округленими?
На мою оцінку, якщо ви зможете інтерпретувати те, що подібний код робить, витягуючи аркуш паперу або переходячи до дошки та виконуючи операції вручну, ви кваліфікуєте себе як добре закруглені. Для того, щоб кваліфікуватись як хороший всебічний програміст в області побітових операцій, ви повинні вміти робити чотири речі:
Вміти легко читати та записувати загальні операції
Для програміста програм звичайні операції з побітовими операторами включають основні оператори |
та &
встановлюють та очищають прапори. Це повинно бути легко. Ви повинні вміти читати та писати подібні речі
open('file', O_WRONLY | O_APPEND | O_CREAT );
// Use an OR operator ^ here and ^ here to set multiple flags
не гальмуючи (припускаючи, що ви знаєте, що означають прапори ).
Вміти читати більш складні операції з деякою роботою
Підрахунок бітів дуже швидко за O (log (n)) час без гілок, гарантуючи, що кількість зіткнень у хеш-кодах може відрізнятись обмеженою сумою та аналізувати адреси електронної пошти , номери телефонів або HTML з регулярним виразом - важкі проблеми. Кожному, хто не є експертом у цих областях, розумно домагатися дошки, це нерозумно бути нездатним почати працювати, щоб зрозуміти.
Вмійте писати деякі складні алгоритми з великою кількістю роботи.
Якщо ви не експерт, не варто сподіватися, що ви зможете робити складні та складні речі. Однак хороший програміст повинен мати можливість це зробити, працюючи над ним постійно. Зробіть цього достатньо, і незабаром ви будете експертом :)