C++, программа. СРОЧНО
Напишите функцию, которая находит кол-во единиц в двойной записи числа.
#include <iostream>
// Функция для подсчета количества единиц в двоичной записи числа
int countSetBits(int n) {
int count = 0;
while (n > 0) {
n &= (n - 1); // Убирает самый правый бит, установленный в 1
count++;
}
return count;
}
int main() {
int number;
std::cout << "Введите целое число: ";
std::cin >> number;
int setBits = countSetBits(number);
std::cout << "Количество единиц в двоичной записи числа " << number << ": " << setBits << std::endl;
return 0;
}
cpp
Как это работает:
countSetBits(int n) функция:
Инициализирует count в 0 (количество единиц).
Использует цикл while (n > 0): Продолжает, пока в числе n есть хоть один установленный бит.
n &= (n - 1): Это ключевая строка, которая работает очень эффективно для подсчета единиц. Она убирает самый правый установленный бит (1) в числе n. Например:
Если n = 10 (двоичное представление 1010), то n - 1 = 9 (двоичное 1001).
n &= (n - 1) выполнит побитовое AND: 1010 & 1001 = 1000. Самый правый установленный бит был убран.
count++: Увеличивает счетчик для каждой убранной единицы.
Возвращает count.
main() функция:
Запрашивает у пользователя целое число.
Вызывает countSetBits() для подсчета единиц в двоичной записи введенного числа.
Выводит результат на экран.
Как скомпилировать и запустить:
Сохраните код: Сохраните код как, например, count_bits.cpp.
Скомпилируйте: Используйте компилятор C++ (например, g++) в командной строке:
g++ count_bits.cpp -o count_bits
bash
Запустите:
./count_bits
bash
Вам будет предложено ввести число.
Пример использования:
Если вы введете 10, программа выведет:
Количество единиц в двоичной записи числа 10: 2
Потому что двоичная запись числа 10 - 1010, в которой 2 единицы.
Преимущества этого решения:
Эффективность: Алгоритм n &= (n - 1) очень быстрый, так как количество итераций цикла равно количеству единиц в числе, а не количеству битов в его представлении. Это делает его лучше, чем простое итерирование по битам.
Простота и понятность: Код достаточно легко читается и понимается.
Стандарт C++: Использует только стандартные возможности C++, поэтому он должен работать на любой платформе с компилятором C++.
int f(int n){return __builtin_popcount(n);} int countOnes(int x){
int r=0;
while(x) r+=x&1, x>>=1;
return r;
} #include <iostream>
#include <string>
#include <bitset>
#include <type_traits>
#define IS_INTEGRAL(T) typename std::enable_if< std::is_integral<T>::value >::type* = 0
template<class T>
int countBits(T byte, IS_INTEGRAL(T))
{
std::bitset<sizeof(T)*8> bs(byte);
return bs.count();
}
int main()
{
unsigned int val = 1055;
std::cout << countBits(val);
return 0;
}