Ce face std::popcount
std::popcount (din <bit>) returnează numărul de biți setați (cu valoarea 1). Procesoarele moderne au o instrucțiune specială pentru asta, deci este foarte rapid.
Acceptă doar tipuri fără semn (unsigned, std::uint8_t, std::uint64_t…). Este util când reții mai multe opțiuni da/nu într-un singur număr: popcount îți spune câte sunt activate.
Parametri
| Parametru | Descriere |
|---|---|
x |
Un întreg fără semn. |
Ce returnează
Numărul de biți 1, ca int.
Exemple
Exemplul 1: Biți setați
Specificatorul {:08b} afișează numărul în binar, pe 8 cifre.
#include <bit>
#include <cstdint>
#include <print>
int main() {
for (std::uint8_t x : {0, 1, 7, 128, 255}) {
std::println("{:3} = {:08b}, biți de 1: {}", x, x, std::popcount(x));
}
}
Rezultat
0 = 00000000, biți de 1: 0
1 = 00000001, biți de 1: 1
7 = 00000111, biți de 1: 3
128 = 10000000, biți de 1: 1
255 = 11111111, biți de 1: 8
Exemplul 2: Câte zile pe săptămână lucrează cineva
#include <bit>
#include <print>
int main() {
// bitul 0 = luni, bitul 6 = duminică
unsigned program_ana = 0b0011111; // luni-vineri
unsigned program_ion = 0b1100101; // luni, miercuri, sâmbătă, duminică
std::println("Ana lucrează {} zile", std::popcount(program_ana));
std::println("Ion lucrează {} zile", std::popcount(program_ion));
std::println("Zile în care lucrează amândoi: {}", std::popcount(program_ana & program_ion));
}
Rezultat
Ana lucrează 5 zile
Ion lucrează 4 zile
Zile în care lucrează amândoi: 2
Greșeli frecvente
- Dai un
intcu semn:std::popcount(-1)nu compilează. Convertește launsigned.
Comenzi înrudite
std::has_single_bit: Verifică dacă un număr fără semn este o putere a lui 2 (are exact un bit de 1).std::bit_width: Returnează câți biți sunt necesari pentru a reprezenta un număr fără semn (0 pentru 0).std::rotl: Rotește biții unui număr fără semn spre stânga (rotl) sau spre dreapta (rotr); biții care ies pe o parte intră pe cealaltă.