Да, modulo x % pow(2, n)
может быть достигнуто с помощью x & ((1 << n) - 1)
Но% -оператор в java может давать разные результаты, если x отрицательный, поэтому слепо подставляя один для другого, может нарушить код ,
Когда бит-адресация, маскировка и т. д. обычно используется & amp; -variant, поскольку его семантически ближе к тому, что используется в ассемблере / C и подписи, обычно не требуется / не заботится в этом случае.
Что касается того, что JIT оптимизирует% до & amp ;, ответ будет: он полностью зависит от JIT - и это движущаяся цель.
В случае x % y
, где y isn ' t константа его довольно трудно определить, если y является степенью 2, поэтому предположительно этот случай не оптимизируется, потому что обнаружение его очень сложно или невозможно. Если y является константой, JIT все еще доказывает, что x не является отрицательным, или вставьте условное выражение, подобное result = x < 0 ? x % y : x & (y-1)
. Он может или не может этого сделать, в зависимости от JIT, о котором идет речь, а также в зависимости от платформы. Как известно, в некоторых случаях Hotspot использует различные оптимизации для разных процессоров (из той же ISA, а именно AMD против Intel).