std::bit_width în C++

Returnează câți biți sunt necesari pentru a reprezenta un număr fără semn (0 pentru 0).

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

Ce face std::bit_width

std::bit_width(x) spune poziția celui mai semnificativ bit de 1, numărată de la 1: bit_width(1) = 1, bit_width(255) = 8, bit_width(256) = 9. Pentru 0 returnează 0.

Pentru x > 0, bit_width(x) - 1 este partea întreagă a lui log2(x), calculată exact, cu întregi, fără erorile de rotunjire ale lui std::log2.

Parametri

Parametru Descriere
x Un întreg fără semn.

Ce returnează

Numărul de biți, ca int (în C++20 inițial, de tipul lui x).

Exemple

Exemplul 1: Biți necesari

#include <bit>
#include <print>

int main() {
    for (unsigned x : {0u, 1u, 5u, 255u, 256u, 1000000u}) {
        std::println("{:>7}: biți necesari = {}", x, std::bit_width(x));
    }
}

Rezultat

      0: biți necesari = 0
      1: biți necesari = 1
      5: biți necesari = 3
    255: biți necesari = 8
    256: biți necesari = 9
1000000: biți necesari = 20

Exemplul 2: Logaritm în baza 2, exact

#include <bit>
#include <cstdint>
#include <print>

int main() {
    std::uint64_t mare = 1ULL << 50;
    std::println("floor(log2(2^50)) = {}", std::bit_width(mare) - 1);
    std::println("floor(log2(1000)) = {}", std::bit_width(1000u) - 1);
}

Rezultat

floor(log2(2^50)) = 50
floor(log2(1000)) = 9

Greșeli frecvente

  • Calculezi bit_width(x) - 1 pentru x = 0 și obții -1. Tratează separat valoarea 0.

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::popcount: Numără câți biți de 1 are un număr întreg fără semn.
  • std::log: Calculează logaritmul natural (log), în baza 10 (log10) sau în baza 2 (log2) al unui număr pozitiv.