Я знаю, что могу выполнять разделение на 2, используя правую смену.Правый сдвиг для выполнения деления на 2 на -1
Для простоты, возьмите 4 разрядную систему
-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
число Если я пытаюсь выполнить
6/2 = 0110 >> 1 = 0011 = 3
-6/ 2 = 1010 >> 1 = 1101 = -3
справедливо как для анолита и -ve числа
Однако, когда приходят до 1
1/2 = 0001 >> 1 = 0000 = 0
-1/ 2 = 1111 >> 1 = 1111 = -1
Кажется, что есть специальный случай в -1, как правый сдвиг, чтобы переместить его в отрицательную бесконечность.
В настоящее время, мне нужно поставить специальный если чек на это, так как я ожидал -1/2 = 0.
мне было интересно, как же парень обработать это исключение в коде? Вы, парень, поставили чек?
+1 за то, что если вы хотите разделить на 2, вы можете просто попробовать оператора деления и посмотреть, как хорошо это работает. –
+1 - спасибо также за выделение того, что вспомогательные оптимизации очень часто не бьют работу, выполняемую компилятором, а «наивный» вариант часто эффективен и корректен в отношении основных вещей, подобных этому. – Matt
Любое отрицательное нечетное число приведет к (как и к любому положительному нечетному числу) n/2, приподнятому в направлении -inf. Так получилось, что для n == -1, то есть -1. – Vatine