четверг, 30 августа 2007 г.

Java Puzzle 27: Shifty i's

Также как и в прошлый раз, тут пишут цикл со странным условием:
int i = 0;
while (-1 << i != 0) i++;
System.out.println(i);

Тот, кто написал такой цикл, думает, если при сдвиге младшие биты заполняются нулями, то эти нули сдвинутся в знаковый бит. Однако он ошибается, так реализация сдвигов в Java не выполняется последовательно на любое число бит. Для типа int дистанция вычисляется как mod 32 (для long - mod 64), что дает нам возможные значения 0...31 (или 0...63) соответственно. Следовательно, -1 << 32 == -1 << 0 == -1. А посчитать количество бит можно другим способом:
int i = 0;
for (int x = -1; x != 0; x <<= 1) i++;
System.out.println(i);

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

Комментариев нет:

Отправить комментарий