Функции C++ определяющие битовый характер числа
Проверка на то, что в «1» установлен только один бит
// 000001000 - true
// 000001010 - false
// 000000000 - false
template< typename T > // работает только для целых чисел
bool only_one_bit_set_to_one (T bits)
{
return bits && !(bits & (bits-1));
}
Обратите внимание, что операторы «&&» и «!» логические, а не битовые!
Проверка на то что установлен только один бит и его порядковый номер от 0 до sizeof(T)-1
template< typename T >
int findSetBit(T bits)
{
if (!(bits && !(bits & (bits-1))))
return -1;
return log2(bits);
}
Компилятор GNU (GCC) имеет в своем арсенале стандартную функцию для определения числа установленных битов
#include <iostream>
int main()
{
std::cout << __builtin_popcount (4) << std::endl;
std::cout << __builtin_popcount (3) << std::endl;
return 0;
}
Начиная с С++11 можно использовать тип bitset в котором реализованы функции any(), none(), count() etc
#include <iostream> // std::cin, std::cout
#include <bitset> // std::bitset
int main ()
{
std::bitset<16> foo;
std::cout << "Please, enter a binary number: ";
std::cin >> foo;
if (foo.any())
std::cout << foo << " has " << foo.count() << " bits set.\n";
else
std::cout << foo << " has no bits set.\n";
return 0;
}