Можно перебирать все биты, проверяя 0 или 1, но есть способ быстрее. Для натурального числа парой битовых операций можно выделить младший бит, отличный от нуля. Есть число, записанное в двоичном виде, n = X…X10…0, вычислим n-1 = X…X01…1 и теперь исключающее или n^(n-1) даст 0…011…1 - это битовая маска на позицию младшего бита (хотя нам нужна не она, а её дополнение). То есть как-то так. int count=0; for (; n>0; count++, n&=~(n^(n-1))); Почему мой способ быстрее, хотя он использует 3 битовые операции и одно вычитание на 1 в числе. Тогда как после преобразования c+=n%2; n/=2; в c+=n&1; n>>=1; имеем 2 битовые операции и одно сложение на 1 разряд. Считая 1 и 0 в каждом разряде равновероятным, проверим число операций на пару 10. Мой способ даёт 3+1, а перебор бит 4+2. То есть мой в среднем в полтора раза быстрее, но для худших случаев (много единичек) может считать медленнее, зато когда единиц почти нет выигрыш неимоверный!