Уменьшение по модулю 32 означает (на базовом уровне), что вы продолжаете вычитать 32, пока не получите число от 0 до 31 включительно.
Другими словами:
actualValue = givenValue % 32;
Причина заключается в том, что нет смысла сдвигать 32-битное значение на 32 бита влево (или вправо), поскольку всегда будет нулевым (поскольку вы сдвигаете биты с одной стороны и смещаете нули в с другой стороны - выполнение этого 32 раза до 32-битного значения приведет к нулю независимо от того, с чего вы начали).
Таким образом, для целых чисел Java (32-разрядных) 31 является разумным пределом. Для длинных (64-битных) разумным пределом является 63.
В приведенном вами примере значение 1 << 35
уменьшено с 35 до 3 (начиная с 35 % 32 == 3
), а 1 << 3 равно 8: </p>
Binary
0000 0001 (1 << 0) == 1
0000 0010 (1 << 1) == 2
0000 0100 (1 << 2) == 4
0000 1000 (1 << 3) == 8
||||
|||+--- 1
||+---- 2
|+----- 4
+------ 8