Share via


<bit> 함수

헤더에는 <bit> 다음과 같은 비 멤버 템플릿 함수가 포함됩니다.

비 멤버 함수 설명
bit_cast 개체 표현을 한 형식에서 다른 형식으로 재해석합니다.
bit_ceil 값보다 크거나 같은 두 개의 가장 작은 힘을 찾습니다.
bit_floor 값보다 크지 않은 2의 가장 큰 힘을 찾습니다.
bit_width 값을 나타내는 데 필요한 가장 작은 비트 수를 찾습니다.
countl_zero 가장 중요한 비트부터 시작하여 연속 비트 수를 0으로 설정합니다.
countl_one 가장 중요한 비트부터 시작하여 연속 비트 수를 1로 설정합니다.
countr_zero 가장 중요한 비트부터 시작하여 연속 비트 수를 0으로 설정합니다.
countr_one 가장 중요한 비트부터 시작하여 연속 비트 수를 1로 설정합니다.
has_single_bit 값에 단일 비트만 1로 설정되어 있는지 확인합니다. 값이 2의 힘인지 여부를 테스트하는 것과 같습니다.
popcount 1로 설정된 비트 수를 계산합니다.
rotl 비트 왼쪽 회전의 결과를 계산합니다.
rotr 비트 오른쪽 회전의 결과를 계산합니다.

bit_cast

형식의 개체에서 새 형식 From 개체로 비트 패턴을 복사합니다 To.

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

매개 변수

종료 날짜
출력의 형식입니다.

From
변환할 값의 형식입니다.

보낸 사람
변환할 값입니다.

반환 값

To 형식의 개체입니다.

결과의 각 비트는 패딩 비트가 없는 한 해당 비트 fromTo일치합니다. 이 경우 결과의 해당 비트는 지정되지 않습니다.

예시

#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_castmemcpy()bit_cast() 대신 이러한 변환을 수행하는 더 좋은 방법입니다. 다음과 같은 이유로 더 좋습니다.

  • bit_cast()constexpr인 경우
  • bit_cast() 에서는 형식을 쉽게 복사할 수 있고 크기가 같아야 합니다. 이렇게 하면 사용 reinterpret_cast 시 발생할 수 있는 잠재적인 문제를 방지하고 memcpy 실수로 잘못 복사할 수 없는 형식을 변환하는 데 사용될 수 있기 때문입니다. memcpy() 또한 크기가 같지 않은 형식 간에 실수로 복사하는 데 사용할 수 있습니다. 예를 들어 부호 없는 int(4바이트) 또는 그 반대로 이중(8바이트)입니다.

이 오버로드는 다음과 같은 경우에만 오버로드 확인에 참여합니다.

  • sizeof(To) == sizeof(From)
  • Tois_trivially_copyable From.

이 함수 템플릿은 constexpr 다음과 같은 경우에만 ToFrom해당 하위 개체의 형식입니다.

  • 공용 구조체 또는 포인터 형식이 아님
  • 멤버 형식에 대한 포인터가 아닙니다.
  • 비휘발성 정규화
  • 참조 형식인 비정적 데이터 멤버가 없습니다.

bit_ceil

값보다 크거나 같은 두 개의 가장 작은 힘을 찾습니다. 예를 들어 지정된 3경우 .4

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

매개 변수

value
테스트할 부호 없는 정수 값입니다.

반환 값

2보다 크거나 같은 value2의 가장 작은 힘입니다.

예시

#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 intunsigned longunsigned shortunsigned char같습니다.

bit_floor

값보다 크지 않은 2의 가장 큰 힘을 찾습니다. 예를 들어 지정된 5경우 .4

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

매개 변수

value
테스트할 부호 없는 정수 값입니다.

반환 값

보다 크지 value않은 두 개의 가장 큰 힘입니다.
0이면 value 0을 반환합니다.

예시

#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 intunsigned longunsigned shortunsigned char같습니다.

bit_width

값을 나타내는 데 필요한 가장 작은 비트 수를 찾습니다.

예를 들어 지정된 5(0b101)는 값 5를 표현하는 데 3개의 이진 비트가 필요하기 때문에 3을 반환합니다.

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

매개 변수

value
테스트할 부호 없는 정수 값입니다.

반환 값

를 나타내는 value데 필요한 비트 수입니다.
0이면 value 0을 반환합니다.

예시

#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 intunsigned longunsigned shortunsigned char같습니다.

countl_zero

가장 중요한 비트부터 시작하여 연속 비트 수를 0으로 설정합니다.

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

매개 변수

value
테스트할 부호 없는 정수 값입니다.

반환 값

가장 중요한 비트부터 시작하는 연속 0비트 수입니다.
0이면 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 intunsigned longunsigned shortunsigned char같습니다.

countl_one

가장 중요한 비트부터 시작하여 연속 비트 수를 1로 설정합니다.

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

매개 변수

value
테스트할 부호 없는 정수 값입니다.

반환 값

가장 중요한 비트부터 시작하여 연속 비트 수를 1로 설정합니다.

예시

#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 intunsigned longunsigned shortunsigned char같습니다.

countr_zero

가장 중요한 비트부터 시작하여 연속 비트 수를 0으로 설정합니다.

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

매개 변수

value
테스트할 부호 없는 정수 값입니다.

반환 값

최소 중요 비트부터 시작하는 연속 0비트 수입니다.
0이면 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 intunsigned longunsigned shortunsigned char같습니다.

countr_one

가장 중요한 비트부터 시작하여 연속 비트 수를 1로 설정합니다.

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

매개 변수

value
테스트할 부호 없는 정수 값입니다.

반환 값

가장 중요한 비트부터 시작하여 연속 비트 수를 1로 설정합니다.

예시

#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 intunsigned longunsigned shortunsigned char같습니다.

has_single_bit

값에 비트 집합이 하나만 있는지 확인합니다. 값이 2의 힘인지 여부를 테스트하는 것과 같습니다.

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

매개 변수

value
테스트할 부호 없는 정수 값입니다.

반환 값

true 비트 집합이 하나뿐이면 value 2의 힘도 의미합니다 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 intunsigned longunsigned shortunsigned char같습니다.

popcount

부호 없는 정수 값에서 1로 설정된 비트 수를 계산합니다.

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

매개 변수

value
테스트할 부호 없는 정수 값입니다.

반환 값

숫자 비트는 1/1로 설정됩니다 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 intunsigned longunsigned shortunsigned char같습니다.

rotl

부호 없는 정수 값의 비트를 지정된 횟수만큼 왼쪽으로 회전합니다. 가장 왼쪽 비트에서 "떨어지는" 비트는 가장 오른쪽 비트로 회전됩니다.

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

매개 변수

value
회전할 부호 없는 정수 값입니다.

s
수행할 왼쪽 회전 수입니다.

반환 값

왼쪽 회전 value 의 결과, s 시간.
0이면 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 intunsigned longunsigned shortunsigned char같습니다.

rotr

지정된 횟수만큼 value 오른쪽 비트를 회전합니다. 맨 오른쪽 비트에서 '떨어지는' 비트는 맨 왼쪽 비트로 다시 회전됩니다.

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

매개 변수

value
회전할 부호 없는 정수 값입니다.

s
수행할 오른쪽 회전 수입니다.

반환 값

오른쪽 회전 value 의 결과, s 시간.
0이면 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 intunsigned longunsigned shortunsigned char같습니다.

요구 사항

헤더<bit>:

네임스페이스: std

/std:c++20 이상이 필요합니다.

참고 항목

<bit>