Шаблонный класс в заголовочном файле <boost/integer/integer_mask.hpp> позволяет получить битовые маски для определенного положения единичного бита либо для непрерывной группы битов определенной длины. Типы для создаваемых масок берутся из шаблонов, объявленнных в хидере integer type selection templates.
Содержание
Шаблон для создания однобитовой маски
Шаблон для создлания маски из группы битов
#include <cstddef> // for std::size_t
namespace boost
{
template < std::size_t Bit >
struct high_bit_mask_t
{
typedef implementation_supplied least;
typedef implementation_supplied fast;
static const least high_bit = implementation_defined;
static const fast high_bit_fast = implementation_defined;
static const std::size_t bit_position = Bit;
};
template < std::size_t Bits >
struct low_bits_mask_t
{
typedef implementation_supplied least;
typedef implementation_supplied fast;
static const least sig_bits = implementation_defined;
static const fast sig_bits_fast = implementation_defined;
static const std::size_t bit_count = Bits;
};
// Specializations for low_bits_mask_t exist for certain bit counts.
} // namespace boost
Шаблонный класс boost::high_bit_mask_t
объявляет константы для масок, представляющих бит в
заданной позиции. Эти маски соответствуют величине 2Bit, где Bit
является параметром шаблона. Положение бита должно быть неотрицательной
величиной от нуля до Max, где Max на 1 меньше числа битов,
которые может хранить самый большой встроенный целый беззнаковый тип.
Следующая таблица описывает члены шаблона high_bit_mask_t.
| член класса | значение |
|---|---|
least |
самый маленький беззнаковый встроенный целый тип, который может хранить бит в указанной позиции |
fast |
максимально эффективный аналог поля
least |
|
|
Константа типа least с созданной маской |
high_bit_fast |
Аналог поля high_bit,
но типа
fast |
bit_position |
Значение параметра шаблона для случаев, когда она нужна из переименованной конкретизации шаблона. |
Шаблон для маски с группой битов
Шаблонный класс boost::low_bits_mask_t
обеспечивает получение группы битов. Маски получаются как числа вида
(2Bitss - 1), где Bits является параметром
шаблона. Количество битов должно быть неотрицательным числом от 0 до Max,
где Max на 1 меньше числа битов, которые
может хранить самый большой встроенный целый беззнаковый тип. Следующая таблица
описывает члены шаблона low_bits_mask_t.
| член класса | значение |
|---|---|
least |
самый маленький встроенный беззнаковый тип, поддерживающий хранение заданного количества битов. |
fast |
самый эффективный аналог типа least. |
sig_bits |
Константа типа least, хранящая созданную маску |
sig_bits_fast |
Аналог константы sig_bits с типом fast |
bit_count |
величина параметра шаблона, для случаев, когда она нужна в переименованной конкретизации шаблона. |
Замечание: когда Bits
в точности равна размеру встроенного беззнакового типа,
реализацию необходимо корректировать для предотвращения неопределенного
поведения. Поэтому есть специализация шаблона low_bits_mask_t
для таких значений параметра шаблона.
#include <boost/integer/integer_mask.hpp>
//...
int main()
{
typedef boost::high_bit_mask_t<29> mask1_type;
typedef boost::low_bits_mask_t<15> mask2_type;
mask1_type::least my_var1;
mask2_type::fast my_var2;
//...
my_var1 |= mask1_type::high_bit;
my_var2 &= mask2_type::sig_bits_fast;
//...
}
Программа integer_mask_test.cpp является упрощенной демонстрацией использования шаблонов.
Данные шаблонные классы являются расширением для шаблонов выбора целого типа. Новые шаблонные классы обеспечивают те же типы заданного размера, но также создают удобные маски для выделения самого старшего из значащих битов в числе, содержащем множество единичных битов. Это может предотвратить загрязнение старших, неиспользуемых битов.
Автором шаблонов является Daryle Walker.
Revised September 23, 2001
© 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.
Последняя правка: 12.05.2005
библиотека BOOST C++
http://www.boost.org
перевод
Elijah Koziev
www.solarix.ru