Existe algo de especial no número 65535?


10

2¹⁶-1 & 2⁵ = 2⁵ (ou? Obviamente?)

Um desenvolvedor me perguntou hoje o que é bit a bit 65535 & 32, ou seja, 2¹⁶-1 & 2⁵ =? A princípio, pensei espontaneamente 32, mas pareceu fácil. Pensei por vários minutos e depois respondi 32. 32 parece ter sido a resposta correta, mas como? 65535 = 2¹⁶-1 = 1111111111111111 (mas não parece certo, pois todos esses números binários devem ser -1 (?)), 32 = 100000, mas eu não conseguia converter isso na minha cabeça, pelo que respondi 32 de qualquer maneira para responder alguma coisa. A resposta 32 é de fato trivial? É da mesma maneira 2¹⁶-1 & 2⁵-1 = 31? Por que o desenvolvedor me perguntou exatamente 65535?

O binário que me pediram para avaliar foi 1111111111111111 & 100000, mas não entendo por que 111111111111111111 não é -1. Não deveria ser -1? 65535 é um número que fornece estouro e como eu sei disso?


3
Deve haver algo especial. Isso me lembra 56 6635, o padrão nacional tcheco para cerveja. Hmmmm ... hora de tomar uma cerveja.
joshp

5
Você faz muitas suposições: 65535 fornece -1 apenas na aritmética do complemento de dois bits de 16 bits. Ele fornece -0 na aritmética do complemento de 16 bits e 65535 no complemento de 32 bits de dois e aritmética do complemento de alguém.
Mouviciel

3
É o limite superior das portas TCP.
Renae Lider

Respostas:


22

O número é tratado como um número inteiro não assinado nesse caso, o que significa que todos os bits configurados não produzirão -1 (se foram assinados, então sim, você estaria correto). Portanto, todos os 16 bits configurados fornecerão 65535.

Curiosamente, o estado assinado não é um fator ao realizar operações lógicas de bits. Os bits não são assinados, pois são o componente mais baixo de um computador. É especificado pela operação cpu se os bits em ex. um registro será tratado com ou sem assinatura.

Os números negativos são produzidos configurando o bit mais significativo (MSB) como true se o número for tratado como assinado (qual "lado" ou qual bit externo será definido varia de acordo com a arquitetura da CPU, ou seja, big-endian / little-endian )


9
A maioria das máquinas modernas se converte em negativa lançando os bits e adicionando o complemento de um: 2. Apenas definir um bit dá a você o problema de ter +0 e -0.
22412 James

11
Isso não é necessariamente um problema. O complemento de 1 trunca para zero, independentemente do sinal do resultado. O complemento de 2 trunca em direção ao infinito. Em certos aplicativos, isso pode causar problemas.
John R. Strohm

18

Isso é trivial. 65535 em binário são todos, portanto ANDing com qualquer X menor que 65535 fornecerá X.


10

Respondendo à segunda parte da sua pergunta. Você o marcou como portanto, 65535 em 32 bits é 00000000000000001111111111111111, assinado ou não assinado, não é -1.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.