BOOST C++: шаблон для вычисления логарифма по основанию 2

Шаблонный класс в <boost/integer/static_log2.hpp> определяет положение максимального бита в заданной целочисленной константе (то есть логарифм по основанию 2 с учетом округления). Этот шаблон полезен при решении задач обобщенного программирования.

Содержание

Описание

Использование

Пример

Демонстрационная программа

Обоснование

Благодарности

Описание


namespace boost
{
 template < unsigned long Value >
 struct static_log2
 {
  static const int  value = implementation_defined;
 };



 template < >
 struct static_log2< 0ul >
 {
    // The logarithm of zero is undefined.
 };

}  // namespace boost

Использование

Шаблонный класс boost::static_log2 получает один параметр, величину типа unsigned long. Шаблон определяет единственное поле value, которое возвращает округленное значение логарифма по основанию 2 для параметра шаблона.

Так как логарифм от нуля, для любого основания, неопределен, то объявлена специализация шаблона static_log2 для параметра 0. Эта специализация не имеет членов, и попытка ее использования (то есть вычисления логарифма нуля) приведет к ошибке времени компиляции.

Пример


#include <boost/integer/static_log2.hpp>


template < unsigned long Value >
bool is_it_what()
{
 typedef boost::static_log2<Value>  lb_type;
 int  temp = lb_type::value;
 //...
 return (temp % 2) != 0;
}

//...

int main()
{
 bool  temp = is_it_what<2000>();
 //...

 #if 0
 temp = is_it_what<0>();  // would give an error
 #endif

 //...
 temp = is_it_what<24>();

 //...
}

Демонстрационная программа

Программа static_log2_test.cpp является упрощенной демонстрацией использования шаблона с разными аргументами.

 

Обоснование

Логарифм по основанию 2, сокращенно обозначаемый lb, иногда используется для алгоритмов, выполняющих грубую прикидку (определение порядка) результатов. Округленное значение логарифма может рассматриваться как наибольшая степень двойки для числа, определяющая максимальный установленный в 1 бит (для двоичных целых).  Иногда положение максимального значащего бита используется в обобщенном программировании, где это значение должно быть известно на стадии компиляции.

Благодарности

Автором шаблона для вычисления двоичного логарифма является Daryle Walker. Giovanni Bajo добавил поддержку для компиляторов, не допускающих частичную параметризацию шаблонов.


Revised May 14, 2002

© Copyright Daryle Walker 2001. Permission to copy, use, modify, sell and distribute this document is granted provided this copyright notice appears in all copies. This document is provided "as is" without express or implied warranty, and with no claim as to its suitability for any purpose.

Последняя правка: 10.05.2005

библиотека BOOST C++ http://www.boost.org
перевод Elijah Koziev www.solarix.ru

  © Mental Computing 2010