So che è possibile eseguire la divisione per 2 utilizzando il passaggio a destra.Spostamento a destra per eseguire Divide per 2 On -1
Per semplicità, prendere un sistema numerico a 4 bit
-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
Se provo a eseguire
6/2 = 0110 >> 1 = 0011 = 3
-6/ 2 = 1010 >> 1 = 1101 = -3
è valido per entrambi + ve -ve e il numero
Tuttavia, quando vengono a 1
1/2 = 0001 >> 1 = 0000 = 0
-1/ 2 = 1111 >> 1 = 1111 = -1
Sembra che ci sia un caso speciale in -1, come spostamento verso destra quindi per spostarlo all'infinito negativo.
Attualmente, ho bisogno di mettere uno speciale assegno, se per questo, come mi aspetto -1/2 = 0.
mi chiedevo come si fa a gestire questa eccezione ragazzo nel codice? Hai messo un check?
+1 per notare che, se vuoi dividere per 2, potresti semplicemente provare l'operatore di divisione e vedere come funziona. –
+1 - grazie anche per evidenziare che le sub-ottimizzazioni molto spesso non battono il lavoro svolto dal compilatore, e l'opzione "ingenua" è spesso efficiente e corretta su cose di base come questa. – Matt
Qualsiasi numero dispari negativo risulterà (come con qualsiasi numero dispari positivo) n/2 rouned verso -inf. Succede che per n == -1, questo è -1. – Vatine