Число степень двойки c

БлогNot. C++: степень двойки, ближайшая сверху к заданному числу

C++: степень двойки, ближайшая сверху к заданному числу

Вот, народу понадобилась функция для расчёта размера буферов, чтоб кратными степени 2 были. посмотрел – парятся, какие-то циклические возведения числа в степень и рекурсии выдумывают. меж тем, на побитовых операциях можно сделать простое и красивое решение:

Можно, конечно, попытаться быть ещё круче, раз всё равно предполагаем 32-разрядный long , предположим и 64-разрядный double :

Как видите, здесь вообще нет цикла, но есть union и один-единственный условный оператор.

Единственный "минус" – будет работать не во всех средах, так, в старом Borland C++ 3.1 не сработало, а вот в C++ Builder 6 – уже да. Также быстродействие будет зависеть от аппаратной реализации типа double .

Но и классическому "школьному" решению с вычислением степеней двойки нельзя отказать в достоинствах, тем более, что вычисление степеней в данном случае тоже можно оптимизировать операцией побитового сдвига:

Если надо проверить, является ли натуральное число value степенью двойки, вот красивая функция. Она считает ноль степенью двойки, если это не так, добавьте дополнительное условие в тело is_power_of_two .

27.03.2012, 12:19; рейтинг: 13294

2 ответа 2

Проблема в том, что операция ^ в C++ (и многих других языках) означает не возведение в степень, а побитное исключающее или.

Для возведения двойки в неотрицательную степень k проще всего использовать просто

А для проверки того, является ли число v степенью двойки, есть знаменитый трюк:

Если вы знакомы с двоичной системой, вам доставит удовольствие разбирать, почему именно он работает.

В C++ нет оператора возведения в степень. Оператор ^ в C++ означает побитовый оператор исключающего ИЛИ.

К тому же вывод сообщений, является ли число степенью 2, нужно вынести за пределы цикла.

Читайте также:  Установку отношения между ключевым полем одной таблицы

Можно использовать подход, похожий на ваш, но когда исходное число делится на 2, пока не получится 1 и остаток от деления будет равен 0.

Ниже представлена демонстрационная программа

Вывод программы на консоль может, к примеру, выглядеть следующим образом

Данный подход можно использовать для проверки, является ли число степенью некоторого другого заданного числа, то есть необязательно двойки. Для этого достаточно заменить в программе значение константы Base на любое число по вашему усмотрению.

Либо вы можете воспользоваться функцией, представленной в вопросе Спецификатор noexcept

Эта статья посвящена одной из наипопулярнейших задач в области программирования. Сложно представить себе программиста, который хотя бы раз в своей карьере не сталкивался с ней.

Существует целый ряд способов её решения. В этой статье будут рассмотрены два, наиболее грамотные из них.

Данные методы считаются таковыми не только в силу своей вычислительной эффективности, но и прежде всего потому, что имеют объективное математическое обоснование.

1.Использование битовых операций

Или в варианте C++ и ему подобных языков

Данное число n является степенью числа 2 или числом 0. Отдельное внимание заслуживает число 1, которое является числом 2 в степени 0.

Таким образом, чтобы проверка была корректной необходимо исключить числа 0 и 1. Например, так:

Или в варианте для C++:

2.Использование логарифмов

Этот способ уже был подробно описан в статье «Является ли число степенью другого числа». В данном способе задача проверки, является ли число степенью двойки, рассматривается как частный случай задачи рассмотренной там.

Для выполнения проверки необходимо вычислить логарифм числа по основанию 2 или частное логарифмов проверяемого числа и числа 2 по общему основанию и проверить является ли результат целым числом.

Если используемый язык программирования или библиотека имеют готовую функцию для вычисления логарифма по основанию 2, решение упрощается до предела.

Оцените статью
Добавить комментарий

Adblock detector