Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Fungsi
Header <bit>
menyertakan fungsi templat non-anggota berikut:
Fungsi non-anggota | Keterangan |
---|---|
bit_cast |
Menginterpretasikan ulang representasi objek dari satu jenis ke jenis lainnya. |
bit_ceil |
Temukan kekuatan terkecil dari dua lebih besar dari atau sama dengan nilai. |
bit_floor |
Temukan kekuatan terbesar dua tidak lebih besar dari nilai. |
bit_width |
Temukan jumlah bit terkecil yang diperlukan untuk mewakili nilai. |
countl_zero |
Hitung jumlah bit berturut-turut yang diatur ke nol, mulai dari bit yang paling signifikan. |
countl_one |
Hitung jumlah bit berturut-turut yang diatur ke satu, mulai dari bit yang paling signifikan. |
countr_zero |
Hitung jumlah bit berturut-turut yang diatur ke nol, mulai dari bit yang paling tidak signifikan. |
countr_one |
Hitung jumlah bit berturut-turut yang diatur ke satu, mulai dari bit yang paling tidak signifikan. |
has_single_bit |
Periksa apakah nilai hanya memiliki satu bit yang diatur ke satu. Ini sama dengan menguji apakah nilai adalah kekuatan dua. |
popcount |
Hitung jumlah bit yang diatur ke satu bit. |
rotl |
Menghitung hasil rotasi kiri bitwise. |
rotr |
Menghitung hasil rotasi kanan bitwise. |
bit_cast
Salin pola bit dari objek jenis From
ke objek baru jenis To
.
template <class To, class From>
[[nodiscard]] constexpr To bit_cast(const From& from) noexcept;
Parameter
Untuk
Jenis output.
Dari
Jenis nilai yang akan dikonversi.
dari
Nilai yang akan dikonversi.
Nilai hasil
Objek jenis To
.
Setiap bit dalam hasil cocok dengan bit yang sesuai di from
kecuali ada bit padding dalam To
, dalam hal ini bit tersebut dalam hasilnya tidak ditentukan.
Contoh
#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
Keterangan
Kode tingkat rendah sering kali perlu menginterpretasikan objek dari satu jenis sebagai jenis lain. Objek yang diinterpretasikan ulang memiliki representasi bit yang sama dengan aslinya, tetapi merupakan jenis yang berbeda.
Alih-alih menggunakan reinterpret_cast
, atau memcpy()
, bit_cast()
adalah cara yang lebih baik untuk membuat konversi ini. Lebih baik karena:
bit_cast()
isconstexpr
bit_cast()
mengharuskan jenis dapat disalin secara sepele dan ukuran yang sama. Ini mencegah potensi masalah yang dapat Anda temui menggunakanreinterpret_cast
danmemcpy
karena dapat digunakan secara tidak sengaja, dan salah, mengonversi jenis yang tidak dapat disalin secara sepele. Selain itu,memcpy()
dapat digunakan untuk menyalin secara tidak sengaja antara jenis yang tidak berukuran sama. Misalnya, ganda (8 byte) menjadi int yang tidak ditandatangani (4 byte), atau sebaliknya.
Kelebihan beban ini hanya berpartisipasi dalam resolusi kelebihan beban jika:
Templat fungsi ini adalah constexpr
jika dan hanya jika To
, From
, dan jenis subobjeknya adalah:
- Bukan tipe union atau pointer
- Bukan penunjuk ke jenis anggota
- Tidak memenuhi syarat volatil
- Tidak memiliki anggota data non-statis yang merupakan jenis referensi
bit_ceil
Temukan kekuatan terkecil dari dua lebih besar dari atau sama dengan nilai. Misalnya, diberikan 3
, mengembalikan 4
.
template<class T>
[[nodiscard]] constexpr T bit_ceil(T value);
Parameter
value
Nilai bilangan bulat yang tidak ditandatangani untuk diuji.
Nilai hasil
Kekuatan terkecil dari dua lebih besar dari atau sama dengan value
.
Contoh
#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
Keterangan
Fungsi templat ini hanya berpartisipasi dalam resolusi kelebihan beban jika T
merupakan jenis bilangan bulat yang tidak ditandatangani. Misalnya: unsigned int
, , unsigned long
unsigned short
, unsigned char
, dan sebagainya.
bit_floor
Temukan kekuatan terbesar dua tidak lebih besar dari nilai. Misalnya, diberikan 5
, mengembalikan 4
.
template< class T >
[[nodiscard]] constexpr T bit_floor(T value) noexcept;
Parameter
value
Nilai bilangan bulat yang tidak ditandatangani untuk diuji.
Nilai hasil
Kekuatan terbesar dari dua yang tidak lebih besar dari value
.
Jika value
nol, mengembalikan nol.
Contoh
#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
Keterangan
Fungsi templat ini hanya berpartisipasi dalam resolusi kelebihan beban jika T
merupakan jenis bilangan bulat yang tidak ditandatangani. Misalnya: unsigned int
, , unsigned long
unsigned short
, unsigned char
, dan sebagainya.
bit_width
Temukan jumlah bit terkecil yang diperlukan untuk mewakili nilai.
Misalnya, diberikan 5 (0b101), mengembalikan 3 karena dibutuhkan 3 bit biner untuk mengekspresikan nilai 5.
template<class T>
[[nodiscard]] constexpr T bit_width(T value) noexcept;
Parameter
value
Nilai bilangan bulat yang tidak ditandatangani untuk diuji.
Nilai hasil
Jumlah bit yang diperlukan untuk mewakili value
.
Jika value
nol, mengembalikan nol.
Contoh
#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
Keterangan
Fungsi templat ini hanya berpartisipasi dalam resolusi kelebihan beban jika T
merupakan jenis bilangan bulat yang tidak ditandatangani. Misalnya: unsigned int
, , unsigned long
unsigned short
, unsigned char
, dan sebagainya.
countl_zero
Hitung jumlah bit berturut-turut yang diatur ke nol, mulai dari bit yang paling signifikan.
template<class T>
[[nodiscard]] constexpr int countl_zero(T value) noexcept;
Parameter
value
Nilai bilangan bulat yang tidak ditandatangani untuk diuji.
Nilai hasil
Jumlah bit nol berturut-turut, mulai dari bit yang paling signifikan.
Jika value
nol, jumlah bit dalam jenis value
.
Contoh
#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
Keterangan
Fungsi templat ini hanya berpartisipasi dalam resolusi kelebihan beban jika T
merupakan jenis bilangan bulat yang tidak ditandatangani. Misalnya: unsigned int
, , unsigned long
unsigned short
, unsigned char
, dan sebagainya.
countl_one
Hitung jumlah bit berturut-turut yang diatur ke satu, mulai dari bit yang paling signifikan.
template<class T>
[[nodiscard]] constexpr int countl_one(T value) noexcept;
Parameter
value
Nilai bilangan bulat yang tidak ditandatangani untuk diuji.
Nilai hasil
Jumlah bit berturut-turut diatur ke satu, mulai dari bit yang paling signifikan.
Contoh
#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
Keterangan
Fungsi templat ini hanya berpartisipasi dalam resolusi kelebihan beban jika T
merupakan jenis bilangan bulat yang tidak ditandatangani. Misalnya: unsigned int
, , unsigned long
unsigned short
, unsigned char
, dan sebagainya.
countr_zero
Hitung jumlah bit berturut-turut yang diatur ke nol, mulai dari bit yang paling tidak signifikan.
template<class T>
[[nodiscard]] constexpr int countr_zero(T value) noexcept;
Parameter
value
Nilai bilangan bulat yang tidak ditandatangani untuk diuji.
Nilai hasil
Jumlah bit nol berturut-turut, mulai dari bit yang paling tidak signifikan.
Jika value
nol, jumlah bit dalam jenis value
.
Contoh
#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
Keterangan
Fungsi templat ini hanya berpartisipasi dalam resolusi kelebihan beban jika T
merupakan jenis bilangan bulat yang tidak ditandatangani. Misalnya: unsigned int
, , unsigned long
unsigned short
, unsigned char
, dan sebagainya.
countr_one
Hitung jumlah bit berturut-turut yang diatur ke satu, mulai dari bit yang paling tidak signifikan.
template<class T>
[[nodiscard]] constexpr int countr_one(T value) noexcept;
Parameter
value
Nilai bilangan bulat yang tidak ditandatangani untuk diuji.
Nilai hasil
Jumlah bit berturut-turut diatur ke satu, mulai dari bit yang paling tidak signifikan.
Contoh
#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
Keterangan
Fungsi templat ini hanya berpartisipasi dalam resolusi kelebihan beban jika T
merupakan jenis bilangan bulat yang tidak ditandatangani. Misalnya: unsigned int
, , unsigned long
unsigned short
, unsigned char
, dan sebagainya.
has_single_bit
Periksa apakah nilai hanya memiliki satu set bit. Ini sama dengan menguji apakah nilai adalah kekuatan dua.
template <class T>
[[nodiscard]] constexpr bool has_single_bit(T value) noexcept;
Parameter
value
Nilai bilangan bulat yang tidak ditandatangani untuk diuji.
Nilai hasil
true
jika value
hanya memiliki satu set bit, yang juga berarti itu value
adalah kekuatan dua. Sebaliknya, false
.
Contoh
#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
Keterangan
Fungsi templat ini hanya berpartisipasi dalam resolusi kelebihan beban jika T
merupakan jenis bilangan bulat yang tidak ditandatangani. Misalnya: unsigned int
, , unsigned long
unsigned short
, unsigned char
, dan sebagainya.
popcount
Hitung jumlah bit yang diatur ke satu dalam nilai bilangan bulat yang tidak ditandatangani.
template<class T>
[[nodiscard]] constexpr int popcount(T value) noexcept;
Parameter
value
Nilai bilangan bulat yang tidak ditandatangani untuk diuji.
Nilai hasil
Bit angka diatur ke satu di value
.
Contoh
#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
Keterangan
Fungsi templat ini hanya berpartisipasi dalam resolusi kelebihan beban jika T
merupakan jenis bilangan bulat yang tidak ditandatangani. Misalnya: unsigned int
, , unsigned long
unsigned short
, unsigned char
, dan sebagainya.
rotl
Memutar bit dari nilai bilangan bulat yang tidak ditandatangani meninggalkan jumlah waktu yang ditentukan. Bit yang "jatuh" dari bit paling kiri diputar ke bit paling kanan.
template<class T>
[[nodiscard]] constexpr T rotl(T value, int s) noexcept;
Parameter
value
Nilai bilangan bulat yang tidak ditandatangani untuk diputar.
s
Jumlah rotasi kiri yang akan dilakukan.
Nilai hasil
Hasil dari memutar value
ke kiri, s
kali.
Jika s
nol, mengembalikan value
.
Jika s
negatif, lakukan rotr(value, -s)
. Bit yang 'jatuh' dari bit paling kanan diputar ke bit paling kiri.
Contoh
#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
Keterangan
Fungsi templat ini hanya berpartisipasi dalam resolusi kelebihan beban jika T
merupakan jenis bilangan bulat yang tidak ditandatangani. Misalnya: unsigned int
, , unsigned long
unsigned short
, unsigned char
, dan sebagainya.
rotr
Memutar bit dari kanan berapa value
kali yang ditentukan. Bit yang 'jatuh' dari bit paling kanan diputar kembali ke bit paling kiri.
template<class T>
[[nodiscard]] constexpr T rotr(T value, int s) noexcept;
Parameter
value
Nilai bilangan bulat yang tidak ditandatangani untuk diputar.
s
Jumlah rotasi yang tepat untuk dilakukan.
Nilai hasil
Hasil dari memutar value
ke kanan, s
kali.
Jika s
nol, mengembalikan value
.
Jika s
negatif, lakukan rotl(value, -s)
. Bit yang 'jatuh' dari bit paling kiri diputar kembali ke bit paling kanan.
Contoh
#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
Keterangan
Fungsi templat ini hanya berpartisipasi dalam resolusi kelebihan beban jika T
merupakan jenis bilangan bulat yang tidak ditandatangani. Misalnya: unsigned int
, , unsigned long
unsigned short
, unsigned char
, dan sebagainya.
Persyaratan
Header: <bit>
Namespace: std
/std:c++20
atau yang lebih baru diperlukan.