Баги моего времени

Функции 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;
}
Подписаться на блог
Отправить
Поделиться
 400   2019   bitwise   c++