Есть ли разница в том, как рассчитать остаток? - PullRequest
6 голосов
/ 14 мая 2019

Предположим, что a = 2 ^ k есть ли разница в производительности или правильности между int c = b%a и int c = b & (a-1)?

1 Ответ

6 голосов
/ 14 мая 2019

Для дополнения до двух 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 не является константой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...