В случаях, когда y
равно 2, существует быстрый подход, который устраняет необходимость в цикле.Этот подход может быть распространен на случаи, когда y
- это некоторая большая степень 2.
Если x
- это степень 2, двоичное представление x
имеет один установленный бит.Существует довольно простой алгоритм поиска битов для подсчета битов в целых числах за O (log n), где n - это битовая ширина целого числа.Многие процессоры также имеют специализированные инструкции, которые могут обрабатывать это как одну операцию, примерно так же быстро, как (например) целочисленное отрицание.
Однако, чтобы расширить подход, сначала примените немного другой подход к проверкеодин бит.Сначала определите позицию младшего значащего бита.Опять же, существует простой алгоритм перебора битов, и многие процессоры имеют быстрые специализированные инструкции.
Если этот бит является единственным битом, то (1 << pos) == x
.Преимущество здесь в том, что если вы тестируете на степень 4, вы можете проверить на pos % 2 == 0
(один бит находится в четном положении).Тестируя на степень любой степени двойки, вы можете проверить на pos % (y >> 1) == 0
.
В принципе, вы можете сделать что-то подобное для тестирования степеней 3 и степеней 3. Проблема в том, что вынужна машина, которая работает в базе 3, что маловероятно.Вы, конечно, можете проверить любое значение x
, чтобы увидеть, имеет ли его представление в базе y
одну ненулевую цифру, но вы будете выполнять больше работы, чем уже делаете.Вышеупомянутое использует тот факт, что компьютеры работают в двоичном формате.
Вероятно, не стоит делать в реальном мире, хотя.