Как можно разделить -1 на 2 и получить -1? (побитовая операция >>) - PullRequest
1 голос
/ 07 мая 2020

Я был удивлен, увидев, что -1 делится на 2 с использованием результатов побитовых операций -1.

Я ожидал, что вернется 0.

Как и при делении 1 или -1 на 2, десятичная часть удаляется, и мы получаем ноль. Возможно, это связано с дополнением Two, но это всего лишь предположение, которое я не совсем понимаю.

может кто-нибудь объяснить это?

-1 >> 1 = -1

-1 / 2 = 0

 public class JavaFiddle
  {
    public static void main(String[] args)
    {
      System.out.println(-1 >> 1);
      System.out.println(-1 / 2);
    }
  }

1 Ответ

5 голосов
/ 07 мая 2020

Отрицательное число в java представлено с использованием записи, называемой 2 дополнением . Если мы предположим, что размер целого числа со знаком равен 8. Вы можете думать о дополнении до 2 следующим образом:

2 will be  00000010
1 will be  00000001
0 will be  00000000
-1 will be 11111111 (Count in reverse from max)
-2 will be 11111110
-3 will be 11111101

(Фактически в java размер int равен 4 байтам)

>> это знаковый оператор побитового сдвига вправо. согласно документации он заполняет 0 в крайнем левом положении для положительных чисел, а для отрицательных чисел он заполняет ту же позицию цифрой 1.

Это означает, что сдвиг -1 на любое количество времени дает - Только 1.

11111111 >> 1 = 11111111

Это из-за Неэквивалентности арифметики c сдвига вправо и деления означает, что для отрицательных чисел деление на 2 и сдвиг вправо не должно считаться равным во всех случаях

...