No Image

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

СОДЕРЖАНИЕ
2 просмотров
11 марта 2020

Блог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, нужно вынести за пределы цикла.

Читайте также:  Портативная игровая приставка psp

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Комментировать
2 просмотров
Комментариев нет, будьте первым кто его оставит

Это интересно
Adblock detector