Я думаю, что в одном случае, когда вы хотите умножить или разделить на степень два, вы не ошибетесь с использованием операторов битового сдвига, даже если компилятор преобразует их в MUL / DIV, потому что некоторые процессоры микрокодируют (на самом деле, макрос) их в любом случае, так что в этих случаях вы добьетесь улучшения, особенно если сдвиг больше 1. Или, если говорить точнее, если у ЦПУ нет операторов битового сдвига, это будет MUL / DIV в любом случае, но еслив процессоре есть операторы битового сдвига, вы избегаете ветви микрокода, а это на несколько инструкций меньше.
Я сейчас пишу некоторый код, который требует много операций удвоения / деления пополам, потому что он работает на плотном двоичном деревеи есть еще одна операция, которая, как я подозреваю, может быть более оптимальной, чем сложение, - сдвиг влево (умножение на две степени) с сложением.Это можно заменить на сдвиг влево и xor, если сдвиг шире, чем количество бит, которое вы хотите добавить, простой пример (i << 1) ^ 1, который добавляет единицу к удвоенному значению.Это, конечно, не относится к сдвигу вправо (степень деления двух), потому что только сдвиг влево (с прямым порядком байтов) заполняет пробел нулями. </p>
В моем коде это умножение / деление на два и степенидве операции используются очень интенсивно, и поскольку формулы уже достаточно короткие, каждая команда, которая может быть исключена, может принести существенный выигрыш.Если процессор не поддерживает эти операторы битового сдвига, никакого усиления не произойдет, но не будет и потери.
Кроме того, в алгоритмах, которые я пишу, они визуально представляют движения, которые происходят, так что в этом смысле онина самом деле более понятно.Левая часть бинарного дерева больше, а правая меньше.Кроме того, в моем коде нечетные и четные числа имеют особое значение, и все левые дочерние элементы в дереве являются нечетными, а все правые дочерние элементы и корень четными.В некоторых случаях, с которыми я еще не сталкивался, но, может, я даже и не думал об этом, x & 1 может быть более оптимальной операцией по сравнению с x% 2.x & 1 на четном числе будет давать ноль, но будет давать 1 для нечетного числа.
Пройдя немного дальше, чем просто нечетная / четная идентификация, если я получу ноль для x & 3, я знаю, что 4 является фактором нашегочисло, и то же самое для x% 7 для 8, и так далее.Я знаю, что эти случаи, вероятно, имеют ограниченную полезность, но приятно знать, что вы можете избежать операции модуля и использовать вместо этого побитовую логическую операцию, потому что побитовые операции почти всегда самые быстрые и наименее вероятно будут неоднозначными для компилятора.
Я в значительной степени изобретаю область плотных бинарных деревьев, поэтому я ожидаю, что люди могут не понять значение этого комментария, так как очень редко люди хотят выполнять факторизацию только по степеням двух или только умножать /разделите полномочия на два.