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) - 1pentrux = 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.