O feriado de Ano Novo está chegando em breve, e finalmente tenho tempo livre. Eu visito vários artigos técnicos todos os dias, e isso está em um ótimo estado.
Eu li um artigo sobre JS à tarde, e há um parágrafo como esse que chamou minha atenção.
A cópia do código é a seguinte:
(function () {
var nomes = [];
Função de retorno (nome) {
addName (nome);
}
função addName (nome) {
if (! ~ names.IndexOf (nome)) // Se houver, não adicione
nomes.push (nome);
console.log (nomes); // ["linkfly"]
}
} ()) ('linkfly');
O que o operador "! ~" Em if (! ~ Names.IndexOF (nome)) significa? Se você não entende, comece com ~ primeiro.
Os testes podem mostrar que o valor do resultado tem essa regra - (x+1)
Depois de pesquisar, alguns artigos perdem apenas uma frase: vire -a invertida por bit binário
Do significado literal, aqui usamos representação binária de oito dígitos: 3 = 00000011, depois ~ 3 = 11111100, a fórmula acima está errada.
A explicação acima ainda é muito abstrata e não específica. De fato, isso envolve o conhecimento do código original, código reverso e código de complemento.
Código original
O bit mais alto da representação de código original é o bit de sinal, que é 0 para indicar um número positivo e 1 para indicar um número negativo. Os bits restantes representam o valor absoluto do número.
Código inverso
Para um número assinado, o código inverso de um número positivo é o mesmo que seu código original; O código inverso de um número negativo é o bit inverso dos bits, exceto o bit de sinal. O código inverso é frequentemente usado como um formulário intermediário no processo de encontrar código de complemento.
Complemento
O complemento de um número positivo é o mesmo que seu código original e código inverso; O complemento de um número negativo é inverter seu código original, exceto o bit de sinal e adicionar 1 ao último bit, ou seja, adicione 1 ao complemento do número. Os números em computadores são geralmente expressos em forma de complemento. No código do complemento, (-128) D é usado em vez de (-0) d. Nota: (-128) D não possui o código original correspondente e o código inverso, (-128) d = (1000.000) b.
Encontre operações complementares
A operação do complemento não considera os bits de sinal, mas inverte os bits originais de seu código original e adiciona 1 ao último bit. O complemento de um número é o complemento do número oposto.
Pegue o exemplo do artigo do autor e entenda
~ significa inversão bit a bit. Se for 00111, torna -se 11000 (inversão bit a bit)
A representação binária de 57 é (1 byte): 00111001
Binária After Inversão Bitwise (~ 57): 11000110 Isso é expresso como decimal: -70
Este é um número negativo, um número assinado. Os números negativos devem ser expressos no computador usando seu código de complemento: complemento = o bit de símbolo é invertido e depois adicionado 1.
Portanto, depois que o bit de sinal -70 (11000110) é invertido após bit a bit, é (10111001) e depois adicionar 1, é (10111010)
Mudança para o sistema decimal: -58
Portanto ~ 57 = -58
Neste ponto, finalmente descobri. Embora a fórmula resumida possa obter resultados rapidamente, não pode explicar o porquê. Como técnicos, gostamos de estudar e aprofundar os detalhes.
Dê tempo:
A fundação é a pedra angular de todos os níveis superiores. Se você se dedica a praticar o taoísmo, a estrada é longa.
O acima é o conteúdo inteiro deste artigo. Espero que todos possam ganhar algo.