Comparação de deslocamento à direita e divisão na linguagem C
Ao trabalhar em um projeto recentemente, encontrei um fenômeno interessante. Ou seja, para a operação de divisão por uma potência inteira de 2, para agilizar o cálculo, em geral, será utilizado o deslocamento à direita (>>) ao invés da divisão (/). Mas, na verdade, no VS, o deslocamento para a direita equivale à operação floor (piso) no matlab, ou seja, arredondamento para o infinito negativo .
Parte I: Divisão e deslocamento à direita
Primeiro, observe o caso em que o dividendo é negativo:
1,-3/2 = -1,5
Para a divisão, -3/2 é igual a -1, o que equivale a truncar diretamente as casas decimais sem arredondamento.
Para deslocamento à direita, -3>>1 é igual a -2, possivelmente com arredondamento (-0,5), possivelmente com arredondamento para menos infinito -Inf, mas sem truncamento.
2,-7/4 = -1,75
Para divisão, -7/4 é igual a -1 e, novamente, as casas decimais são truncadas diretamente, sem arredondamento.
Para deslocamento à direita, -7>>2 é igual a -2, possivelmente com arredondamento (-0,75), possivelmente com arredondamento para menos infinito -Inf, mas sem truncamento.
3,-5/4 = -1,25
Para divisão, -5/4 é igual a -1, que é truncado diretamente.
Para o deslocamento à direita, -5>>2 é igual a -2, o que prova que o cálculo anterior não é arredondado (-0,25), e deve ser arredondado para o infinito negativo -Inf, que equivale ao chão no matlab.
Resumo: No caso em que o dividendo é negativo, o deslocamento à direita não é equivalente à divisão. A divisão trunca diretamente a parte decimal, enquanto o deslocamento à direita é o piso.
Quando o dividendo é um número positivo:
1,3/2 = 1,5
Para a divisão, 3/2 é igual a 1, que é o mesmo que o resultado do dividendo ser um número negativo, a única diferença é o sinal, que ainda está truncado.
Para deslocamento à direita, 3>>1 é igual a 1, que é diferente do resultado de um dividendo negativo. De 1,5 para 1, prova mais uma vez que o método de deslocamento para a direita é o arredondamento para o infinito negativo-Inf.
2,7/4 = 1,75
Para a divisão, 7/4 é igual a 1, que é diretamente truncado. Mesmo resultado de um dividendo negativo, exceto por um sinal diferente.
Para deslocamento à direita, 7>>2 é igual a 2, de 1,75 a 1, arredondado para infinito negativo -Inf.
3,5/4 = 1,25
Para a divisão, 5/4 é igual a 1, truncado diretamente, e o resultado é o mesmo que o dividendo é negativo.
Para deslocamento à direita, -5>>2 é igual a -2, de 1,25 a 1, que é equivalente ao piso, arredondado para o infinito negativo -Inf.
Resumo: No caso em que o dividendo é positivo, o resultado do deslocamento à direita é igual à divisão. Para números positivos, o efeito do truncamento direto por divisão é equivalente ao arredondamento para -inf.
Resumir:
Para a divisão, o resultado é o mesmo, seja o dividendo positivo ou negativo. Para o deslocamento à direita, o resultado é diferente quando o dividendo é positivo e negativo.
Parte II: Multiplicação e Deslocamento à Esquerda
Como não há decimais no cálculo da multiplicação, os resultados do deslocamento à esquerda e da multiplicação são os mesmos para números positivos e negativos.
(texto completo)
Autor --- Panasonic J27
(A imagem que acompanha não tem nada a ver com este artigo)
Declaração de direitos autorais: Algumas imagens, textos ou outros materiais neste artigo podem vir de muitos sites e descrições diferentes, por isso não posso listá-los aqui. Se houver alguma violação, informe-me e exclua-a imediatamente. Todos são bem-vindos para reimprimir, mas se alguém citar ou copiar meu artigo, você deve indicar em seu artigo que as imagens ou o texto que você usa vêm de meu artigo, caso contrário, a infração será investigada. ----Panasonic J27