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?
Respostas:
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 )
fonte
Isso é trivial. 65535 em binário são todos, portanto ANDing com qualquer X menor que 65535 fornecerá X.
fonte
Respondendo à segunda parte da sua pergunta. Você o marcou como 32 bits; portanto, 65535 em 32 bits é
00000000000000001111111111111111
, assinado ou não assinado, não é -1.fonte