std::popcount în C++

Numără câți biți de 1 are un număr întreg fără semn.

Sintaxă
constexpr int popcount(T x) noexcept;  // T fără semn

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 int cu semn: std::popcount(-1) nu compilează. Convertește la unsigned.

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ă.