почему результат отрицательного числа в операторе сдвига >> отличается от нормального деления? - PullRequest
0 голосов
/ 21 февраля 2019

Я пытаюсь понять концепцию операторов сдвига, и я тестировал следующий код:

15 >> 2;    
- 15 >> 2 

Результат первого оператора равен 3, так как 15/4 = 3, но результатВторое утверждение -4.

Я понимаю, что двоичное значение -15 равно 11110001, и когда мы сдвигаем 2 вправо, мы имеем 11111100, а это -4.но я не понимаю, почему результат отличается от простого деления -15 / 4 = -3, а не -4?

, пожалуйста, объясните мне, почему это произошло?

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Java использует дополнение к двум для представления отрицательных чисел.
Сдвиг вправо на n битов двоичного числа со знаком, дополняющего два, приводит к его делению на 2n, но всегда округляется (к отрицательному значению)бесконечность).Это отличается от способа, которым округление обычно выполняется в целочисленном делении со знаком (которое округляется до 0).

0 голосов
/ 21 февраля 2019

Оператор сдвига отбрасывает любую математическую дробь, беря слово, а не усечение. JLS, раздел 15.19 , сообщает:

Значение n >> s равно n смещенным вправо s позициям битов с расширением знака.Результирующее значение floor(n / 2<sup>s</sup>).Для неотрицательных значений n это эквивалентно усеченному целочисленному делению, вычисляемому оператором целочисленного деления /, на два до степени s.

Этаж-3.75 равно -4, тогда как усечение привело бы к -3.

Когда значение смещено вправо, биты теряются, поскольку они смещены «с конца» значения.Это то, что отвечает за работу на полу.

-15: 11110001
 -4: 11111100 // The rightmost 1 bit above is lost, resulting in what looks like the floor function.
...