<bit>
– funkce
Hlavička <bit>
obsahuje následující funkce šablony, které nejsou členy:
Nečlenové funkce | Popis |
---|---|
bit_cast |
Reinterpretujte reprezentaci objektu z jednoho typu do druhého. |
bit_ceil |
Najde nejmenší mocninu dvou větších nebo rovnajících se hodnotě. |
bit_floor |
Najděte největší mocninu dvou ne větší než hodnotu. |
bit_width |
Najděte nejmenší počet bitů potřebných k vyjádření hodnoty. |
countl_zero |
Spočítejte počet po sobě jdoucích bitů nastavených na nulu počínaje nejvýznamnějším bitem. |
countl_one |
Spočítejte počet po sobě jdoucích bitů nastavených na jeden, počínaje nejvýznamnějším bitem. |
countr_zero |
Spočítejte počet po sobě jdoucích bitů nastavených na nulu počínaje nejméně významným bitem. |
countr_one |
Spočítejte počet po sobě jdoucích bitů nastavených na jednu, počínaje nejméně významným bitem. |
has_single_bit |
Zkontrolujte, jestli má hodnota nastavenou jenom jednu bitovou hodnotu. To je stejné jako testování, jestli je hodnota výkonem dvou. |
popcount |
Spočítejte počet bitů nastavených na jednu. |
rotl |
Vypočítá výsledek bitové levé rotace. |
rotr |
Vypočítá výsledek bitové pravé rotace. |
bit_cast
Zkopírujte bitový vzor z objektu typu From
do nového objektu typu To
.
template <class To, class From>
[[nodiscard]] constexpr To bit_cast(const From& from) noexcept;
Parametry
Na
Typ výstupu.
Od
Typ hodnoty, kterou chcete převést.
od
Hodnota, kterou chcete převést.
Vrácená hodnota
Objekt typu To
.
Každý bit ve výsledku odpovídá odpovídajícímu bitu, from
pokud neexistují odsazení bitů , To
v takovém případě tyto bity ve výsledku nejsou zadané.
Příklad
#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
Poznámky
Kód nízké úrovně často potřebuje interpretovat objekt jednoho typu jako jiný typ. Reinterpretovaný objekt má stejnou bitovou reprezentaci jako původní objekt, ale je jiný typ.
Místo použití reinterpret_cast
nebo memcpy()
bit_cast()
je lepší způsob, jak tyto převody provést. Je lepší, protože:
bit_cast()
jeconstexpr
bit_cast()
vyžaduje triviálně kopírovatelné typy a stejnou velikost. Tím se zabrání potenciálním problémům, se kterými byste se mohli setkat,reinterpret_cast
amemcpy
protože je možné je použít k neúmyslné a nesprávné převodu neschválných typů.memcpy()
Můžete také použít k neúmyslné kopírování mezi typy, které nemají stejnou velikost. Například dvojitá (8 bajtů) do bez znaménka (4 bajty) nebo naopak.
Toto přetížení se účastní pouze rozlišení přetížení, pokud:
sizeof(To) == sizeof(From)
To
aFrom
jsou is_trivially_copyable.
Tato šablona funkce jeconstexpr
, pokud a pouze pokud From
To
, a typy jejich podobjektů jsou:
- Ne sjednocení nebo typ ukazatele
- Není ukazatel na typ členu.
- Nevolatilně kvalifikovaný
- Nemá žádný nestatický datový člen, který je odkazovým typem
bit_ceil
Najde nejmenší mocninu dvou větších nebo rovnajících se hodnotě. Například dané 3
, vrátí 4
.
template<class T>
[[nodiscard]] constexpr T bit_ceil(T value);
Parametry
value
Celočíselná hodnota bez znaménka, která se má testovat.
Vrácená hodnota
Nejmenší mocnina dvou větších nebo rovna value
.
Příklad
#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
Poznámky
Tato funkce šablony se účastní rozlišení přetížení pouze v případě T
, že je celočíselného typu bez znaménka. Například: unsigned int
, , unsigned long
unsigned short
, unsigned char
atd.
bit_floor
Najděte největší mocninu dvou ne větší než hodnotu. Například dané 5
, vrátí 4
.
template< class T >
[[nodiscard]] constexpr T bit_floor(T value) noexcept;
Parametry
value
Celočíselná hodnota bez znaménka, která se má testovat.
Vrácená hodnota
Největší mocnina dvou, která není větší než value
.
Pokud value
je nula, vrátí nulu.
Příklad
#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
Poznámky
Tato funkce šablony se účastní rozlišení přetížení pouze v případě T
, že je celočíselného typu bez znaménka. Například: unsigned int
, , unsigned long
unsigned short
, unsigned char
atd.
bit_width
Najděte nejmenší počet bitů potřebných k vyjádření hodnoty.
Například s hodnotou 5 (0b101) vrátí hodnotu 3, protože k vyjádření hodnoty 5 trvá 3 binární bity.
template<class T>
[[nodiscard]] constexpr T bit_width(T value) noexcept;
Parametry
value
Celočíselná hodnota bez znaménka, která se má testovat.
Vrácená hodnota
Počet bitů potřebných k reprezentaci value
.
Pokud value
je nula, vrátí nulu.
Příklad
#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
Poznámky
Tato funkce šablony se účastní rozlišení přetížení pouze v případě T
, že je celočíselného typu bez znaménka. Například: unsigned int
, , unsigned long
unsigned short
, unsigned char
atd.
countl_zero
Spočítejte počet po sobě jdoucích bitů nastavených na nulu počínaje nejvýznamnějším bitem.
template<class T>
[[nodiscard]] constexpr int countl_zero(T value) noexcept;
Parametry
value
Celočíselná hodnota bez znaménka, která se má testovat.
Vrácená hodnota
Počet posoběch
Pokud value
je nula, počet bitů v typu value
.
Příklad
#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
Poznámky
Tato funkce šablony se účastní rozlišení přetížení pouze v případě T
, že je celočíselného typu bez znaménka. Například: unsigned int
, , unsigned long
unsigned short
, unsigned char
atd.
countl_one
Spočítejte počet po sobě jdoucích bitů nastavených na jeden, počínaje nejvýznamnějším bitem.
template<class T>
[[nodiscard]] constexpr int countl_one(T value) noexcept;
Parametry
value
Celočíselná hodnota bez znaménka, která se má testovat.
Vrácená hodnota
Počet posoběch
Příklad
#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
Poznámky
Tato funkce šablony se účastní rozlišení přetížení pouze v případě T
, že je celočíselného typu bez znaménka. Například: unsigned int
, , unsigned long
unsigned short
, unsigned char
atd.
countr_zero
Spočítejte počet po sobě jdoucích bitů nastavených na nulu počínaje nejméně významným bitem.
template<class T>
[[nodiscard]] constexpr int countr_zero(T value) noexcept;
Parametry
value
Celočíselná hodnota bez znaménka, která se má testovat.
Vrácená hodnota
Počet po sobě jdoucích nul bitů počínaje nejméně významným bitem.
Pokud value
je nula, počet bitů v typu value
.
Příklad
#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
Poznámky
Tato funkce šablony se účastní rozlišení přetížení pouze v případě T
, že je celočíselného typu bez znaménka. Například: unsigned int
, , unsigned long
unsigned short
, unsigned char
atd.
countr_one
Spočítejte počet po sobě jdoucích bitů nastavených na jednu, počínaje nejméně významným bitem.
template<class T>
[[nodiscard]] constexpr int countr_one(T value) noexcept;
Parametry
value
Celočíselná hodnota bez znaménka, která se má testovat.
Vrácená hodnota
Počet posoběch
Příklad
#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
Poznámky
Tato funkce šablony se účastní rozlišení přetížení pouze v případě T
, že je celočíselného typu bez znaménka. Například: unsigned int
, , unsigned long
unsigned short
, unsigned char
atd.
has_single_bit
Zkontrolujte, jestli má hodnota nastavenou jenom jednu bitovou sadu. To je stejné jako testování, jestli je hodnota výkonem dvou.
template <class T>
[[nodiscard]] constexpr bool has_single_bit(T value) noexcept;
Parametry
value
Celočíselná hodnota bez znaménka, která se má testovat.
Vrácená hodnota
true
pokud value
má pouze jednu bitovou sadu, což také znamená, že value
je to mocnina dvou. V opačném případě hodnota false
.
Příklad
#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
Poznámky
Tato funkce šablony se účastní rozlišení přetížení pouze v případě T
, že je celočíselného typu bez znaménka. Například: unsigned int
, , unsigned long
unsigned short
, unsigned char
atd.
popcount
Spočítejte počet bitů nastavených na jeden v celočíselné hodnotě bez znaménka.
template<class T>
[[nodiscard]] constexpr int popcount(T value) noexcept;
Parametry
value
Celočíselná hodnota bez znaménka, která se má testovat.
Vrácená hodnota
Počet bitů nastavený na hodnotu 1 v value
.
Příklad
#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
Poznámky
Tato funkce šablony se účastní rozlišení přetížení pouze v případě T
, že je celočíselného typu bez znaménka. Například: unsigned int
, , unsigned long
unsigned short
, unsigned char
atd.
rotl
Obměna bitů celočíselné hodnoty bez znaménka ponechá zadaný počet opakování. Bity, které "vypadnou" z levého bitu, se otočí do pravé části.
template<class T>
[[nodiscard]] constexpr T rotl(T value, int s) noexcept;
Parametry
value
Celočíselná hodnota bez znaménka, kterou chcete otočit.
s
Počet levých otočení, které se mají provést.
Vrácená hodnota
Výsledek otáčení value
doleva, s
časy.
Pokud s
je nula, vrátí hodnotu value
.
Je-li s
záporné, dělá rotr(value, -s)
. Bity, které "vypadnou" z pravé části, se otočí do levého bitového bitového rohu.
Příklad
#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
Poznámky
Tato funkce šablony se účastní rozlišení přetížení pouze v případě T
, že je celočíselného typu bez znaménka. Například: unsigned int
, , unsigned long
unsigned short
, unsigned char
atd.
rotr
Otočí bity value
doprava zadaný početkrát. Bity, které "vypadnou" z pravé části, se otočí zpět do levé části.
template<class T>
[[nodiscard]] constexpr T rotr(T value, int s) noexcept;
Parametry
value
Celočíselná hodnota bez znaménka, kterou chcete otočit.
s
Počet správných otočení, které se mají provést.
Vrácená hodnota
Výsledek otáčení value
doprava, s
časy.
Pokud s
je nula, vrátí hodnotu value
.
Je-li s
záporné, dělá rotl(value, -s)
. Bity, které "vypadnou" z levého bitu, se otočí zpět do pravé části.
Příklad
#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
Poznámky
Tato funkce šablony se účastní rozlišení přetížení pouze v případě T
, že je celočíselného typu bez znaménka. Například: unsigned int
, , unsigned long
unsigned short
, unsigned char
atd.
Požadavky
Záhlaví: <bit>
Obor názvů: std
/std:c++20
nebo novější se vyžaduje.