Принимаются только самые младшие биты значения сдвига.
Это то же самое, что и
return (i << (distance & 63)) | (i >>> (-distance & 63));
или
return (i << (distance & 63)) | (i >>> ((64-distance) & 63));
или
return (i << distance) | (i >>> (64-distance));
Одной из причин использования отрицательного числа является то, что оно работает независимо от типа, поэтому вы можете смело менять его в будущем.
например.
// This works regardless of whether `x` is `int` or `long`
// and you can safely change the type in the future.
// 1 if negative, 0 if non-negative
x >>> -1;
// works for 32-bit but not 64-bit so if you change the type later,
// it could break without compiler error.
x >>> 31;
Вы можете найти это интересным http://vanillajava.blogspot.com/2012/01/shifting-challenge.html