Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Заголовок <bit> включает следующие функции шаблона, отличные от членов:
| Функции, не являющиеся членами | Description |
|---|---|
bit_cast |
Переосмысление представления объекта из одного типа в другой. |
bit_ceil |
Найдите наименьшую мощность двух больше или равно значению. |
bit_floor |
Найдите самую большую мощность из двух значений, не превышающих значение. |
bit_width |
Найдите наименьшее количество битов, необходимых для представления значения. |
countl_zero |
Подсчитывать число последовательных битов, равное нулю, начиная с самого значительного бита. |
countl_one |
Подсчитывать число последовательных битов, установленных на один, начиная с самого значительного бита. |
countr_zero |
Подсчитывать число последовательных битов, равное нулю, начиная с наименьшего значительного бита. |
countr_one |
Подсчитывает количество последовательных битов, начиная с наименьшего значительного бита. |
has_single_bit |
Проверьте, имеет ли значение только один бит. Это то же самое, что и проверка того, является ли значение двумя. |
popcount |
Подсчитывать число битов, установленных на один. |
rotl |
Вычислить результат побитового поворота влево. |
rotr |
Вычислить результат побитового поворота вправо. |
bit_cast
Скопируйте битовый шаблон из объекта типа From в новый объект типа To.
template <class To, class From>
[[nodiscard]] constexpr To bit_cast(const From& from) noexcept;
Параметры
Кому
Тип выходных данных.
From
Тип, в который нужно преобразовать значение.
from
Преобразуемое значение .
Возвращаемое значение
Объект типа To.
Каждый бит в результате соответствует соответствующему биту, from если в результатах нет битов с заполнением, в этом случае эти биты Toв результате не определены.
Пример
#include <bit>
#include <iostream>
int main()
{
float f = std::numeric_limits<float>::infinity();
int i = std::bit_cast<int>(f);
std::cout << "float f = " << std::hex << f
<< "\nstd::bit_cast<int>(f) = " << std::hex << i << '\n';
return 0;
}
float f = inf
std::bit_cast<int>(f) = 7f800000
Замечания
Код низкого уровня часто требует интерпретации объекта одного типа как другого типа. Повторно интерпретированный объект имеет то же битовое представление, что и исходный, но является другим типом.
Вместо использования reinterpret_castили memcpy()bit_cast() лучше сделать эти преобразования. Это лучше, потому что:
bit_cast()имеет значениеconstexpr.bit_cast()требует, чтобы типы были тривиально копируемыми и одинаковыми. Это предотвращает потенциальные проблемы, с которыми можно столкнуться с помощью,reinterpret_castиmemcpyпотому что они могут использоваться для непреднамеренного и неправильного преобразования нетривиально копируемых типов. Кроме того,memcpy()можно использовать для непреднамеренного копирования между типами, которые не совпадают с размером. Например, двойный (8 байт) в неназначенной инте (4 байта) или другой способ.
Эта перегрузка участвует только в разрешении перегрузки, если:
Этот шаблон функции имеет значение constexpr , если и только Toесли , Fromи типы их вложенных объектов:
- Не тип объединения или указателя
- Не указатель на тип элемента
- Не изменяющийся
- Нет нестатитического элемента данных, являющегося ссылочным типом
bit_ceil
Найдите наименьшую мощность двух больше или равно значению. Например, при указании 3возвращается 4.
template<class T>
[[nodiscard]] constexpr T bit_ceil(T value);
Параметры
value
Значение целого числа без знака для тестирования.
Возвращаемое значение
Наименьшая мощность двух больше или равно value.
Пример
#include <bit>
#include <bitset>
#include <iostream>
int main()
{
for (auto i = 0u; i < 6u; ++i) // bit_ceil() takes an unsigned integer type
{
auto nextClosestPowerOf2 = std::bit_ceil(i);
std::cout << "\nbit_ceil(0b" << std::bitset<4>(i) << ") = "
<< "0b" << std::bitset<4>(nextClosestPowerOf2);
}
return 0;
}
bit_ceil(0b0000) = 0b0001
bit_ceil(0b0001) = 0b0001
bit_ceil(0b0010) = 0b0010
bit_ceil(0b0011) = 0b0100
bit_ceil(0b0100) = 0b0100
bit_ceil(0b0101) = 0b1000
Замечания
Эта функция шаблона участвует только в разрешении перегрузки, если T это тип целого числа без знака. Например, unsigned int, unsigned long, unsigned shortunsigned charи т. д.
bit_floor
Найдите самую большую мощность из двух значений, не превышающих значение. Например, при указании 5возвращается 4.
template< class T >
[[nodiscard]] constexpr T bit_floor(T value) noexcept;
Параметры
value
Значение целого числа без знака для тестирования.
Возвращаемое значение
Самая большая сила из двух, которые не больше value.
Если value значение равно нулю, возвращается ноль.
Пример
#include <bit>
#include <bitset>
#include <iostream>
int main()
{
for (auto i = 0u; i < 6u; ++i) // bit_floor() takes an unsigned integer type
{
auto previousPowerOf2 = std::bit_floor(i);
std::cout << "\nbit_floor(0b" << std::bitset<4>(i) << ") = 0b"
<< std::bitset<4>(previousPowerOf2);
}
return 0;
}
bit_floor(0b0000) = 0b0000
bit_floor(0b0001) = 0b0001
bit_floor(0b0010) = 0b0010
bit_floor(0b0011) = 0b0010
bit_floor(0b0100) = 0b0100
bit_floor(0b0101) = 0b0100
Замечания
Эта функция шаблона участвует только в разрешении перегрузки, если T это тип целого числа без знака. Например, unsigned int, unsigned long, unsigned shortunsigned charи т. д.
bit_width
Найдите наименьшее количество битов, необходимых для представления значения.
Например, если задано значение 5 (0b101), возвращается 3, так как для выражения значения 5 требуется 3 двоичных бита.
template<class T>
[[nodiscard]] constexpr T bit_width(T value) noexcept;
Параметры
value
Значение целого числа без знака для тестирования.
Возвращаемое значение
Количество битов, необходимых для представления value.
Если value значение равно нулю, возвращается ноль.
Пример
#include <bit>
#include <iostream>
int main()
{
for (unsigned i=0u; i <= 8u; ++i)
{
std::cout << "\nbit_width(" << i << ") = "
<< std::bit_width(i);
}
return 0;
}
bit_width(0) = 0
bit_width(1) = 1
bit_width(2) = 2
bit_width(3) = 2
bit_width(4) = 3
bit_width(5) = 3
bit_width(6) = 3
bit_width(7) = 3
bit_width(8) = 4
Замечания
Эта функция шаблона участвует только в разрешении перегрузки, если T это тип целого числа без знака. Например, unsigned int, unsigned long, unsigned shortunsigned charи т. д.
countl_zero
Подсчитывать число последовательных битов, равное нулю, начиная с самого значительного бита.
template<class T>
[[nodiscard]] constexpr int countl_zero(T value) noexcept;
Параметры
value
Значение целого числа без знака для тестирования.
Возвращаемое значение
Число последовательных нулевых битов, начиная с самого значительного бита.
Если value значение равно нулю, число битов в типе value.
Пример
#include <bit>
#include <bitset>
#include <iostream>
int main()
{
for (unsigned char result = 0, i = 0; i < 9; i++)
{
std::cout << "\ncountl_zero(0b" << std::bitset<8>(result) << ") = " << std::countl_zero(result);
result = result == 0 ? 1 : result * 2;
}
return 0;
}
countl_zero(0b00000000) = 8
countl_zero(0b00000001) = 7
countl_zero(0b00000010) = 6
countl_zero(0b00000100) = 5
countl_zero(0b00001000) = 4
countl_zero(0b00010000) = 3
countl_zero(0b00100000) = 2
countl_zero(0b01000000) = 1
countl_zero(0b10000000) = 0
Замечания
Эта функция шаблона участвует только в разрешении перегрузки, если T это тип целого числа без знака. Например, unsigned int, unsigned long, unsigned shortunsigned charи т. д.
countl_one
Подсчитывать число последовательных битов, установленных на один, начиная с самого значительного бита.
template<class T>
[[nodiscard]] constexpr int countl_one(T value) noexcept;
Параметры
value
Значение целого числа без знака для тестирования.
Возвращаемое значение
Число последовательных битов, установленных на один, начиная с самого значительного бита.
Пример
#include <bit>
#include <bitset>
#include <iostream>
int main()
{
unsigned char value = 0;
for (unsigned char bit = 128; bit > 0; bit /= 2)
{
value |= bit;
std::cout << "\ncountl_one(0b" << std::bitset<8>(value) << ") = "
<< std::countl_one(value);
}
return 0;
}
countl_one(0b10000000) = 1
countl_one(0b11000000) = 2
countl_one(0b11100000) = 3
countl_one(0b11110000) = 4
countl_one(0b11111000) = 5
countl_one(0b11111100) = 6
countl_one(0b11111110) = 7
countl_one(0b11111111) = 8
Замечания
Эта функция шаблона участвует только в разрешении перегрузки, если T это тип целого числа без знака. Например, unsigned int, unsigned long, unsigned shortunsigned charи т. д.
countr_zero
Подсчитывать число последовательных битов, равное нулю, начиная с наименьшего значительного бита.
template<class T>
[[nodiscard]] constexpr int countr_zero(T value) noexcept;
Параметры
value
Значение целого числа без знака для тестирования.
Возвращаемое значение
Число последовательных нулевых битов, начиная с наименьшего значительного бита.
Если value значение равно нулю, число битов в типе value.
Пример
#include <bit>
#include <bitset>
#include <iostream>
int main()
{
for (unsigned char result = 0, i = 0; i < 9; i++)
{
std::cout << "\ncountr_zero(0b" << std::bitset<8>(result) << ") = "
<< std::countr_zero(result);
result = result == 0 ? 1 : result * 2;
}
return 0;
}
countr_zero(0b00000000) = 8
countr_zero(0b00000001) = 0
countr_zero(0b00000010) = 1
countr_zero(0b00000100) = 2
countr_zero(0b00001000) = 3
countr_zero(0b00010000) = 4
countr_zero(0b00100000) = 5
countr_zero(0b01000000) = 6
countr_zero(0b10000000) = 7
Замечания
Эта функция шаблона участвует только в разрешении перегрузки, если T это тип целого числа без знака. Например, unsigned int, unsigned long, unsigned shortunsigned charи т. д.
countr_one
Подсчитывает количество последовательных битов, начиная с наименьшего значительного бита.
template<class T>
[[nodiscard]] constexpr int countr_one(T value) noexcept;
Параметры
value
Значение целого числа без знака для тестирования.
Возвращаемое значение
Число последовательных битов, установленных на один, начиная с наименьшего значительного бита.
Пример
#include <bit>
#include <bitset>
#include <iostream>
int main()
{
unsigned char value = 0;
for (int bit = 1; bit <= 128; bit *= 2)
{
value |= bit;
std::cout << "\ncountr_one(0b" << std::bitset<8>(value) << ") = "
<< std::countr_one(value);
}
return 0;
}
countr_one(0b00000001) = 1
countr_one(0b00000011) = 2
countr_one(0b00000111) = 3
countr_one(0b00001111) = 4
countr_one(0b00011111) = 5
countr_one(0b00111111) = 6
countr_one(0b01111111) = 7
countr_one(0b11111111) = 8
Замечания
Эта функция шаблона участвует только в разрешении перегрузки, если T это тип целого числа без знака. Например, unsigned int, unsigned long, unsigned shortunsigned charи т. д.
has_single_bit
Проверьте, имеет ли значение только один бит. Это то же самое, что и проверка того, является ли значение двумя.
template <class T>
[[nodiscard]] constexpr bool has_single_bit(T value) noexcept;
Параметры
value
Значение целого числа без знака для тестирования.
Возвращаемое значение
true Если value имеется только один битовый набор, то это также означает, что value это мощность двух. В противном случае — false.
Пример
#include <bit>
#include <bitset>
#include <iostream>
#include <iomanip>
int main()
{
for (auto i = 0u; i < 10u; ++i)
{
std::cout << "has_single_bit(0b" << std::bitset<4>(i) << ") = "
<< std::boolalpha << std::has_single_bit(i) << '\n';
}
return 0;
}
has_single_bit(0b0000) = false
has_single_bit(0b0001) = true
has_single_bit(0b0010) = true
has_single_bit(0b0011) = false
has_single_bit(0b0100) = true
has_single_bit(0b0101) = false
has_single_bit(0b0110) = false
has_single_bit(0b0111) = false
has_single_bit(0b1000) = true
has_single_bit(0b1001) = false
Замечания
Эта функция шаблона участвует только в разрешении перегрузки, если T это тип целого числа без знака. Например, unsigned int, unsigned long, unsigned shortunsigned charи т. д.
popcount
Подсчитывайте число битов, установленных в одно целое число без знака.
template<class T>
[[nodiscard]] constexpr int popcount(T value) noexcept;
Параметры
value
Значение целого числа без знака для тестирования.
Возвращаемое значение
Число битов, заданных для одного в value.
Пример
#include <bit>
#include <bitset>
#include <iostream>
int main()
{
for (unsigned char value = 0; value < 16; value++)
{
std::cout << "\npopcount(0b" << std::bitset<4>(value) << ") = "
<< std::popcount(value);
}
return 0;
}
popcount(0b0000) = 0
popcount(0b0001) = 1
popcount(0b0010) = 1
popcount(0b0011) = 2
popcount(0b0100) = 1
popcount(0b0101) = 2
popcount(0b0110) = 2
popcount(0b0111) = 3
popcount(0b1000) = 1
popcount(0b1001) = 2
popcount(0b1010) = 2
popcount(0b1011) = 3
popcount(0b1100) = 2
popcount(0b1101) = 3
popcount(0b1110) = 3
popcount(0b1111) = 4
Замечания
Эта функция шаблона участвует только в разрешении перегрузки, если T это тип целого числа без знака. Например, unsigned int, unsigned long, unsigned shortunsigned charи т. д.
rotl
Поворот битов целого числа без знака оставил указанное количество раз. Биты, которые "выпадают" из крайнего левого бита, вращаются в самый правый бит.
template<class T>
[[nodiscard]] constexpr T rotl(T value, int s) noexcept;
Параметры
value
Целое число без знака для поворота.
s
Количество выполняемых поворотов влево.
Возвращаемое значение
Результат поворота value влево, s время.
Если s равно нулю, возвращается value.
Если s отрицательный, выполняется rotr(value, -s). Биты, которые "выпадают" из крайнего правого бита вращаются в самый левый бит.
Пример
#include <bit>
#include <bitset>
#include <iostream>
int main()
{
unsigned char bits = 1;
for (int i = 0; i < 8; ++i)
{
std::cout << "rotl(0b" << std::bitset<8>(bits) << ", 1) = ";
bits = std::rotl(bits, 1);
std::cout << "0b" << std::bitset<8>(bits) << '\n';
}
std::cout << "rotl(0b" << std::bitset<8>(bits) << ",-1) = ";
bits = std::rotl(bits, -1);
std::cout << "0b" << std::bitset<8>(bits);
return 0;
}
rotl(0b00000001, 1) = 0b00000010
rotl(0b00000010, 1) = 0b00000100
rotl(0b00000100, 1) = 0b00001000
rotl(0b00001000, 1) = 0b00010000
rotl(0b00010000, 1) = 0b00100000
rotl(0b00100000, 1) = 0b01000000
rotl(0b01000000, 1) = 0b10000000
rotl(0b10000000, 1) = 0b00000001
rotl(0b00000001,-1) = 0b10000000
Замечания
Эта функция шаблона участвует только в разрешении перегрузки, если T это тип целого числа без знака. Например, unsigned int, unsigned long, unsigned shortunsigned charи т. д.
rotr
Поворачивает биты value вправо по указанному количеству раз. Биты, которые "выпадают" из крайнего правого бита вращаются обратно в самый левый бит.
template<class T>
[[nodiscard]] constexpr T rotr(T value, int s) noexcept;
Параметры
value
Целое число без знака для поворота.
s
Количество выполняемых поворотов вправо.
Возвращаемое значение
Результат поворота value вправо, s время.
Если s равно нулю, возвращается value.
Если s отрицательный, выполняется rotl(value, -s). Биты, которые "выпадают" из крайнего левого бита, поворачиваются обратно в самый правый бит.
Пример
#include <bit>
#include <bitset>
#include <iostream>
int main()
{
unsigned char bits = 128;
for (int i = 0; i < 8; ++i)
{
std::cout << "rotr(0b" << std::bitset<8>(bits) << ", 1) = ";
bits = std::rotr(bits, 1);
std::cout << "0b" << std::bitset<8>(bits) << '\n';
}
std::cout << "rotr(0b" << std::bitset<8>(bits) << ",-1) = ";
bits = std::rotr(bits, -1);
std::cout << "0b" << std::bitset<8>(bits);
return 0;
}
rotr(0b10000000, 1) = 0b01000000
rotr(0b01000000, 1) = 0b00100000
rotr(0b00100000, 1) = 0b00010000
rotr(0b00010000, 1) = 0b00001000
rotr(0b00001000, 1) = 0b00000100
rotr(0b00000100, 1) = 0b00000010
rotr(0b00000010, 1) = 0b00000001
rotr(0b00000001, 1) = 0b10000000
rotr(0b10000000,-1) = 0b00000001
Замечания
Эта функция шаблона участвует только в разрешении перегрузки, если T это тип целого числа без знака. Например, unsigned int, unsigned long, unsigned shortunsigned charи т. д.
Требования
Заголовок: <bit>
Пространство имен: std
/std:c++20 или более поздней версии требуется.