То, как представлены отрицательные числа, называется дополнением 2. Чтобы продемонстрировать, как это работает, возьмите -12 в качестве примера. 12, в двоичном формате - 00001100 (предположим, что целые числа - 8 бит, хотя на самом деле они намного больше). Возьмите дополнение 2, просто инвертируя каждый бит, и вы получите 11110011. Затем просто добавьте 1, чтобы получить 11110100. Обратите внимание, что если вы снова примените те же шаги, вы получите положительные 12 назад.
>>> сдвиги в ноль, независимо от того, что 12 >>> 1 должно дать вам 00000110, что равно 6, и (-12) >>> 1 должен дать вам 01111010, то есть 122. Если вы на самом деле попробуйте это на Java, вы получите гораздо большее число, так как Java ints на самом деле намного больше 8 бит.
>> Сдвиги немного идентичны наивысшему биту, поэтому положительные числа остаются положительными, а отрицательные - отрицательными. 12 >> 1 - 00000110 (еще 6) и (-12) >> 1 будет 11111010, что отрицательно 6.
Возможные дубликаты: [Разница между >>> и >>] (http://stackoverflow.com/q/2811319/1529630), [Java >> против >>> Operator?] (http://stackoverflow.com/q/1034640/1529630) – Oriol