Sé que puedo dividir entre 2 usando el desplazamiento a la derecha.Desplazar a la derecha para realizar la división por 2 en -1
Por simplicidad, echar un sistema de números de 4 bits
-1 - 1111
-2 - 1110
-3 - 1101
-4 - 1100
-5 - 1011
-6 - 1010
-7 - 1001
-8 - 1000
7 - 0111
6 - 0110
5 - 0101
4 - 0100
3 - 0011
2 - 0010
1 - 0001
0 - 0000
Si trato de realizar
6/2 = 0110 >> 1 = 0011 = 3
-6/ 2 = 1010 >> 1 = 1101 = -3
es válido para ambos + ve y -ve número
Sin embargo, cuando venga a 1
1/2 = 0001 >> 1 = 0000 = 0
-1/ 2 = 1111 >> 1 = 1111 = -1
Parece que hay un caso especial en -1, como desplazamiento a la derecha para moverlo a infinito negativo.
Actualmente, tengo que poner una especial si cheque para esto, ya que estoy esperando -1/2 = 0.
Me preguntaba ¿cómo se controla esta excepción chico en su código? ¿Tu hombre puso un cheque si?
+1 para señalar que, si desea dividir por 2, puede probar el operador de división y ver qué tan bien funciona. –
+1 - gracias también por destacar que las suboptimizaciones a menudo no superan el trabajo realizado por el compilador, y la opción "ingenua" suele ser eficiente y correcta en cosas básicas como esta. – Matt
Cualquier número impar negativo dará como resultado (como con cualquier número impar positivo) n/2 redondeado hacia -inf. Solo sucede que para n == -1, eso es -1. – Vatine