Подсчет количества единиц в 1 бит: эффективные решения на C++

В этой статье блога мы рассмотрим различные эффективные методы решения проблемы «количество 1 бит» в LeetCode с использованием C++. Задача требует, чтобы мы подсчитали количество бит, которым присвоено значение 1 в заданном целом числе.

Метод 1: наивный подход
Самый простой подход – перебирать каждый бит целого числа и подсчитывать количество бит, установленных в 1. Вот код:

int hammingWeight(uint32_t n) {
    int count = 0;
    while (n != 0) {
        count += n & 1;
        n >>= 1;
    }
    return count;
}

Метод 2: алгоритм Брайана Кернигана
Алгоритм Брайана Кернигана представляет собой оптимизированный подход, который более эффективно подсчитывает количество установленных бит в целом числе. Он работает путем многократного вычитания 1 из числа и выполнения побитовой операции И с исходным числом. Вот код:

int hammingWeight(uint32_t n) {
    int count = 0;
    while (n != 0) {
        n &= (n - 1);
        count++;
    }
    return count;
}

Метод 3: Таблица поиска
Если нам нужно подсчитать количество бит в нескольких целых числах, мы можем предварительно вычислить количество бит для всех возможных значений (от 0 до 255) и сохранить их в таблице поиска. Затем для любого целого числа мы можем разделить его на 8-битные сегменты и посчитать биты, используя справочную таблицу. Вот код:

int hammingWeight(uint32_t n) {
    int count = 0;
    uint8_t* lookupTable = new uint8_t[256]; // Precomputed lookup table
    // Initialize lookup table with number of bits for each possible 8-bit value
    // Count bits in 8-bit segments
    count += lookupTable[n & 0xFF];
    count += lookupTable[(n >> 8) & 0xFF];
    count += lookupTable[(n >> 16) & 0xFF];
    count += lookupTable[(n >> 24) & 0xFF];
    delete[] lookupTable;
    return count;
}

Метод 4: встроенная функция
В C++ мы также можем использовать встроенную функцию bitset::count()для подсчета количества установленных бит в целом числе. Этот метод преобразует целое число в его двоичное представление и подсчитывает количество единиц. Вот код:

#include <bitset>
int hammingWeight(uint32_t n) {
    std::bitset<32> bits(n);
    return bits.count();
}

В этой статье мы рассмотрели несколько методов решения проблемы «Количество 1 бит» в LeetCode с использованием C++. Представленные решения включают в себя наивный подход, алгоритм Брайана Кернигана, подход с использованием таблицы поиска и использование встроенной функции bitset::count(). В зависимости от конкретных требований и ограничений вашего приложения вы можете выбрать наиболее подходящий метод.