Для дополнения до двух int
и a
степень двойки b % a
равна b & a-1
тогда и только тогда, когда b
неотрицательно или кратно a
.
Как следствие, компилятор может заменить b % a
на b & a-1
, только если он знает, что b
неотрицателен или знает, что он кратен a
. (В последнем случае следует заменить выражение на ноль.) На типичных текущих процессорах инструкция AND и вычитание будут, по крайней мере, столь же быстрой и часто быстрее, чем остальная (делительная) команда, поэтому b & a-1
- это предпочтительнее, и программист, ищущий производительность, должен использовать его, если он знает, что условия выполнены, если он не уверен, что компилятор сгенерирует AND для b % a
, или они также хотят частное b/a
. (Если требуется частное, компилятор должен сгенерировать инструкцию деления, а процессоры обычно предоставляют остаток вместе с частным.)
Конечно, компилятор может быть уверен, что b
неотрицателен, сделав его unsigned int
. Убедиться, что компилятор знает, что a
- это степень двух, сложнее, если a
не является константой.