Aracılığıyla paylaş


<bit> işlevleri

Üst <bit> bilgi aşağıdaki üye olmayan şablon işlevlerini içerir:

Üye olmayan işlevler Açıklama
bit_cast Nesne gösterimini bir türden diğerine yeniden yorumla.
bit_ceil Bir değerden büyük veya buna eşit olan iki değerin en küçük gücünü bulun.
bit_floor Bir değerden büyük olmayan ikinin en büyük gücünü bulun.
bit_width Bir değeri temsil etmek için gereken en küçük bit sayısını bulun.
countl_zero En önemli bitten başlayarak, ardışık bit sayısını sıfır olarak ayarlayın.
countl_one En önemli bitten başlayarak, ardışık bit sayısını bir olarak ayarlayın.
countr_zero En az önemli bitten başlayarak, ardışık bit sayısını sıfır olarak ayarlayın.
countr_one En az önemli bitten başlayarak, ardışık bit sayısını bir olarak ayarlayın.
has_single_bit Bir değerin yalnızca bir bit olarak ayarlı olup olmadığını denetleyin. Bu, bir değerin ikinin gücü olup olmadığını test etmeyle aynıdır.
popcount Bir olarak ayarlanan bit sayısını sayar.
rotl Bit düzeyinde sol döndürmenin sonucunu hesapla.
rotr Bit düzeyinde sağa döndürmenin sonucunu hesaplama.

bit_cast

Türündeki bir nesneden türündeki From yeni bir nesneye bit deseni Tokopyalayın.

template <class To, class From>
[[nodiscard]] constexpr To bit_cast(const From& from) noexcept;

Parametreler

İşlem
Çıktının türü.

Başlangıç
Dönüştürülecek değerin türü.

kaynak
Dönüştürülecek değer.

Dönüş değeri

To türünün bir nesnesi.

sonuçtaki her bit, içinde from doldurma bitleri Toolmadığı sürece içindeki ilgili bitle eşleşir ve bu durumda sonuçtaki bu bitler belirtilmez.

Örnek

#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

Açıklamalar

Düşük düzeyli kodun genellikle bir türe ait bir nesneyi başka bir tür olarak yorumlaması gerekir. Yeniden yorumlanmış nesne özgün ile aynı bit gösterimine sahiptir, ancak farklı bir türdür.

bu dönüştürmeleri yapmak için , veya memcpy()bit_cast() kullanmak reinterpret_castyerine daha iyi bir yoldur. Daha iyi çünkü:

  • bit_cast() dir constexpr
  • bit_cast() türlerin önemsiz olarak kopyalanabilir ve aynı boyutta olmasını gerektirir. Bu, ve memcpy kullanarak reinterpret_cast karşılaşabileceğiniz olası sorunları önler çünkü yanlışlıkla ve yanlış şekilde, önemsiz olarak kopyalanamayan türleri dönüştürmek için kullanılabilirler. Ayrıca, memcpy() aynı boyutta olmayan türler arasında yanlışlıkla kopyalama yapmak için de kullanılabilir. Örneğin, imzalanmamış bir int'e (4 bayt) çift (8 bayt) veya tersi.

Bu aşırı yükleme yalnızca aşağıdaki durumlarda aşırı yükleme çözümüne katılır:

Bu işlev şablonu yalnızca constexpr ve yalnızca To, Fromise ve alt nesne türleri şöyledir:

  • Birleşim veya işaretçi türü değil
  • Üye türü işaretçisi değil
  • Geçici olmayan niteleme
  • Başvuru türü olan statik olmayan veri üyesi yok

bit_ceil

Bir değerden büyük veya buna eşit olan iki değerin en küçük gücünü bulun. Örneğin, verilen 3, döndürür 4.

template<class T>
[[nodiscard]] constexpr T bit_ceil(T value);

Parametreler

value
Test için işaretsiz tamsayı değeri.

Dönüş değeri

değerinden büyük veya buna eşit valueolan iki küçük güç.

Örnek

#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

Açıklamalar

Bu şablon işlevi yalnızca işaretsiz bir tamsayı türündeyse T aşırı yükleme çözümlemeye katılır. Örneğin: unsigned int, unsigned long, unsigned short, unsigned char, vb.

bit_floor

Bir değerden büyük olmayan ikinin en büyük gücünü bulun. Örneğin, verilen 5, döndürür 4.

template< class T >
[[nodiscard]] constexpr T bit_floor(T value) noexcept;

Parametreler

value
Test için işaretsiz tamsayı değeri.

Dönüş değeri

değerinden büyük olmayan en büyük valueiki güç.
Sıfır ise value sıfır döndürür.

Örnek

#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

Açıklamalar

Bu şablon işlevi yalnızca işaretsiz bir tamsayı türündeyse T aşırı yükleme çözümlemeye katılır. Örneğin: unsigned int, unsigned long, unsigned short, unsigned char, vb.

bit_width

Bir değeri temsil etmek için gereken en küçük bit sayısını bulun.

Örneğin, verilen 5 (0b101), 5 değerini ifade etmek için 3 ikili bit gerektiğinden 3 döndürür.

template<class T>
[[nodiscard]] constexpr T bit_width(T value) noexcept;

Parametreler

value
Test için işaretsiz tamsayı değeri.

Dönüş değeri

öğesini temsil valueetmek için gereken bit sayısı.
Sıfır ise value sıfır döndürür.

Örnek

#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

Açıklamalar

Bu şablon işlevi yalnızca işaretsiz bir tamsayı türündeyse T aşırı yükleme çözümlemeye katılır. Örneğin: unsigned int, unsigned long, unsigned short, unsigned char, vb.

countl_zero

En önemli bitten başlayarak, ardışık bit sayısını sıfır olarak ayarlayın.

template<class T>
[[nodiscard]] constexpr int countl_zero(T value) noexcept;

Parametreler

value
Test için işaretsiz tamsayı değeri.

Dönüş değeri

En önemli bitten başlayarak ardışık sıfır bit sayısı.
Sıfır ise value , türündeki valuebit sayısıdır.

Örnek

#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

Açıklamalar

Bu şablon işlevi yalnızca işaretsiz bir tamsayı türündeyse T aşırı yükleme çözümlemeye katılır. Örneğin: unsigned int, unsigned long, unsigned short, unsigned char, vb.

countl_one

En önemli bitten başlayarak, ardışık bit sayısını bir olarak ayarlayın.

template<class T>
[[nodiscard]] constexpr int countl_one(T value) noexcept;

Parametreler

value
Test için işaretsiz tamsayı değeri.

Dönüş değeri

En önemli bitten başlayarak ardışık bit sayısı bir olarak ayarlanır.

Örnek

#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

Açıklamalar

Bu şablon işlevi yalnızca işaretsiz bir tamsayı türündeyse T aşırı yükleme çözümlemeye katılır. Örneğin: unsigned int, unsigned long, unsigned short, unsigned char, vb.

countr_zero

En az önemli bitten başlayarak, ardışık bit sayısını sıfır olarak ayarlayın.

template<class T>
[[nodiscard]] constexpr int countr_zero(T value) noexcept;

Parametreler

value
Test için işaretsiz tamsayı değeri.

Dönüş değeri

En az önemli bitten başlayarak ardışık sıfır bit sayısı.
Sıfır ise value , türündeki valuebit sayısıdır.

Örnek

#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

Açıklamalar

Bu şablon işlevi yalnızca işaretsiz bir tamsayı türündeyse T aşırı yükleme çözümlemeye katılır. Örneğin: unsigned int, unsigned long, unsigned short, unsigned char, vb.

countr_one

En az önemli bitten başlayarak, ardışık bit sayısını bir olarak ayarlayın.

template<class T>
[[nodiscard]] constexpr int countr_one(T value) noexcept;

Parametreler

value
Test için işaretsiz tamsayı değeri.

Dönüş değeri

En az önemli bitten başlayarak ardışık bit sayısı bir olarak ayarlanır.

Örnek

#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

Açıklamalar

Bu şablon işlevi yalnızca işaretsiz bir tamsayı türündeyse T aşırı yükleme çözümlemeye katılır. Örneğin: unsigned int, unsigned long, unsigned short, unsigned char, vb.

has_single_bit

Bir değerin yalnızca bir bit ayarlı olup olmadığını denetleyin. Bu, bir değerin ikinin gücü olup olmadığını test etmeyle aynıdır.

template <class T>
[[nodiscard]] constexpr bool has_single_bit(T value) noexcept;

Parametreler

value
Test için işaretsiz tamsayı değeri.

Dönüş değeri

true yalnızca bir bit kümesi varsa value , bu value da ikinin gücü olduğu anlamına gelir. Tersi durumda false.

Örnek

#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

Açıklamalar

Bu şablon işlevi yalnızca işaretsiz bir tamsayı türündeyse T aşırı yükleme çözümlemeye katılır. Örneğin: unsigned int, unsigned long, unsigned short, unsigned char, vb.

popcount

İşaretsiz bir tamsayı değerinde bire ayarlanmış bit sayısını sayar.

template<class T>
[[nodiscard]] constexpr int popcount(T value) noexcept;

Parametreler

value
Test için işaretsiz tamsayı değeri.

Dönüş değeri

içindeki bit sayısı bir valueolarak ayarlanır.

Örnek

#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

Açıklamalar

Bu şablon işlevi yalnızca işaretsiz bir tamsayı türündeyse T aşırı yükleme çözümlemeye katılır. Örneğin: unsigned int, unsigned long, unsigned short, unsigned char, vb.

rotl

İşaretsiz bir tamsayı değerinin bitlerini belirtilen sayıda sola döndürür. En soldaki bitten "çıkan" bitler en sağdaki bite döndürülür.

template<class T>
[[nodiscard]] constexpr T rotl(T value, int s) noexcept;

Parametreler

value
Döndürülecek işaretsiz tamsayı değeri.

s
Gerçekleştirilecek sol döndürme sayısı.

Dönüş değeri

Sola dönmenin value sonucu, s zaman.
Sıfır ise s , döndürür value.
Negatifse s , yapar rotr(value, -s). En sağdaki bitten 'düşen' bitler en soldaki bite döndürülür.

Örnek

#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

Açıklamalar

Bu şablon işlevi yalnızca işaretsiz bir tamsayı türündeyse T aşırı yükleme çözümlemeye katılır. Örneğin: unsigned int, unsigned long, unsigned short, unsigned char, vb.

rotr

Bitleri value belirtilen sayıda sağa döndürür. En sağdaki bitten 'düşen' bitler en soldaki bite geri döndürülür.

template<class T>
[[nodiscard]] constexpr T rotr(T value, int s) noexcept;

Parametreler

value
Döndürülecek işaretsiz tamsayı değeri.

s
Gerçekleştirilecek sağ döndürme sayısı.

Dönüş değeri

Sağa dönmenin value sonucu, s zaman.
Sıfır ise s , döndürür value.
Negatifse s , yapar rotl(value, -s). En soldaki bitten 'düşen' bitler en sağdaki bite geri döndürülür.

Örnek

#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

Açıklamalar

Bu şablon işlevi yalnızca işaretsiz bir tamsayı türündeyse T aşırı yükleme çözümlemeye katılır. Örneğin: unsigned int, unsigned long, unsigned short, unsigned char, vb.

Gereksinimler

Üstbilgi: <bit>

Ad alanı: std

/std:c++20 veya üzeri gereklidir.

Ayrıca bkz.

<bit>