Простейший способ - сдвигать беззнаковое целое вправо, пока оно не станет равным 0. Количество сдвигов и есть его разрядность.
//Листинг 12.2
#include <iostream>
using namespace std;
//Определение разрядности числа
int wordlen(unsigned vv)
{ int i;
for(i=0; vv!=0; i ++, vv>>=1);
return i;}
int main()
{ unsigned u=0xEF145;
cout<<wordlen(u)<<'\n';
return 0; }
Результат выполнения программы:
Подсчет количества единичных битов
При сдвиге вправо все биты числа будут последовательно находиться в младшем разряде, из которого их нужно выделять с использованием операции И с единичной маской.
//Листинг 12.3
#include <iostream>
using namespace std;
//Подсчет количества единичных битов
int what_is_1(unsigned n)
{ int i,s;
for(i = 0,s=0; i < sizeof(int)*8; i++)
{ if (n & 1) s++; n>>=1; } // Проверить младший бит и сдвинуть
return s; }
int main(){
unsigned a=0xF5;
cout<<what_is_1(a)<<'\n';
return 0;}
Результаты выполнения программы: