Quão difícil é a interpretação dos operadores bit a bit?
Eu programo sistemas embarcados. Eu pratiquei muito essas coisas. Sua pergunta vinculada sobre mapas de hash com o código
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);
}
fez todo o sentido para mim em quanto tempo levaria para ditar o código em voz alta. Os eventos descritos em bitCount
são imediatamente claros, mas leva um minuto para descobrir por que ele realmente conta os bits. Os comentários seriam ótimos, porém, e tornariam a compreensão do que o código faz apenas um pouco mais difícil do que o problema de hash.
É importante fazer a distinção entre ler e entender o código. Eu posso interpretar o bitCount
código e ler o que ele faz, mas provar por que funciona ou mesmo que levaria um minuto. Há uma diferença entre ser capaz de ler o código sem problemas e saber por que o código é do jeito que é. Alguns algoritmos são simplesmente difíceis. O que o hash
código fazia sentido, mas o comentário explica por que o que estava sendo feito. Não desanime se uma função que usa operadores bit a bit é difícil de entender, eles costumam ser usados para fazer coisas matemáticas complicadas que seriam difíceis, independentemente do formato.
Uma analogia
Estou acostumado a essas coisas. Um assunto que eu não estou acostumado é regex. Ocasionalmente, trato deles em scripts de construção, mas nunca no trabalho diário de desenvolvimento.
Eu sei como usar os seguintes elementos de uma regex:
[]
classes de personagem
- Os
*
, .
e +
wildcards
- O início da sequência
^
e o final da sequência$
- As classes de caracteres \ d, \ w e \ s
- O sinalizador / g
Isso é suficiente para criar consultas simples, e muitas das consultas que vejo não se afastam disso.
Qualquer coisa que não esteja nesta lista, pego uma folha de dicas. Qualquer coisa, exceto, {}
e ()
- A cola não será suficiente. Eu sei o suficiente sobre esses caras para saber que vou precisar de um quadro branco, um manual de referência e talvez um colega de trabalho. Você pode agrupar alguns algoritmos malucos em algumas linhas curtas de regex.
Para criar um regex que exija ou sugira qualquer coisa que não esteja na minha lista de elementos conhecidos, vou listar todas as classes de entradas que espero reconhecer e colocá-las em um conjunto de testes. Vou criar o regex lenta e incrementalmente, com muitas etapas intermitentes, e confirmar essas etapas para controlar a fonte e / ou deixá-las em um comentário para que eu possa entender o que deveria acontecer mais tarde, quando ocorrer uma quebra. Se estiver no código de produção, vou garantir que seja revisado por alguém com mais experiência.
É aqui que você está com operadores bit a bit?
Então você quer ser bem arredondado?
Na minha opinião, se você é capaz de interpretar o que esse código faz, puxando um pedaço de papel ou indo para o quadro branco e executando as operações manualmente, você se qualifica como completo. Para se qualificar como um bom programador completo na área de operações bit a bit, você deve ser capaz de fazer quatro coisas:
Ser capaz de ler e gravar operações comuns de maneira fluida
Para um programador de aplicativos, as operações comuns com operadores bit a bit incluem os operadores básicos de |
e &
para definir e limpar sinalizadores. Isso deve ser fácil. Você deve ler e escrever coisas como
open('file', O_WRONLY | O_APPEND | O_CREAT );
// Use an OR operator ^ here and ^ here to set multiple flags
sem diminuir a velocidade (supondo que você saiba o que as bandeiras significam ).
Consiga ler operações mais complexas com algum trabalho
Contando bits muito rapidamente no tempo O (log (n)) sem ramificações, garantindo que o número de colisões em hashCodes possa diferir por uma quantidade limitada e analisando endereços de email , números de telefone ou HTML com um regex são problemas difíceis. É razoável que qualquer pessoa que não seja especialista nessas áreas procure o quadro branco, não é razoável ser incapaz de começar a trabalhar para entender.
Seja capaz de escrever algoritmos complexos com muito trabalho
Se você não é um especialista, não deve esperar fazer coisas complexas e difíceis. No entanto, um bom programador deve conseguir fazer isso trabalhando continuamente. Faça isso o suficiente, e em breve você será um especialista :)