<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
형식의 개체입니다.
결과의 각 비트는 패딩 비트가 없는 한 해당 비트 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()
또한 크기가 같지 않은 형식 간에 실수로 복사하는 데 사용할 수 있습니다. 예를 들어 부호 없는 int(4바이트) 또는 그 반대로 이중(8바이트)입니다.
이 오버로드는 다음과 같은 경우에만 오버로드 확인에 참여합니다.
이 함수 템플릿은 constexpr
다음과 같은 경우에만 To
From
해당 하위 개체의 형식입니다.
- 공용 구조체 또는 포인터 형식이 아님
- 멤버 형식에 대한 포인터가 아닙니다.
- 비휘발성 정규화
- 참조 형식인 비정적 데이터 멤버가 없습니다.
bit_ceil
값보다 크거나 같은 두 개의 가장 작은 힘을 찾습니다. 예를 들어 지정된 3
경우 .4
template<class T>
[[nodiscard]] constexpr T bit_ceil(T value);
매개 변수
value
테스트할 부호 없는 정수 값입니다.
반환 값
2보다 크거나 같은 value
2의 가장 작은 힘입니다.
예시
#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 short
unsigned 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 int
unsigned long
unsigned short
unsigned 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 int
unsigned long
unsigned short
unsigned 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 int
unsigned long
unsigned short
unsigned 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 int
unsigned long
unsigned short
unsigned 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 int
unsigned long
unsigned short
unsigned 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 int
unsigned long
unsigned short
unsigned 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 int
unsigned long
unsigned short
unsigned 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 int
unsigned long
unsigned short
unsigned 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 int
unsigned long
unsigned short
unsigned 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 int
unsigned long
unsigned short
unsigned char
같습니다.
요구 사항
머리글: <bit>
네임스페이스: std
/std:c++20
이상이 필요합니다.