Другие языки программирования и технологии

Как написать программу для этой задачи (СИ)?

Дано натуральное число меньше 16. Посчитать количество его единичных битов. Например, если дано число 9, запись которого в двоичной системе счисления равна 10012 (подстрочная цифра 2 справа от числа означает, что оно записано в двоичной системе счисления), то количество его единичных битов равно 2.

Вот, совсем не понимаю, как это должно выглядеть :(
n = 9; // твое число < 16 (строго)
c = 0; // счетчик
r = 4; // кол-во разрядов (у тебя условие число меньше 16, в двоичной с/с это 4 разряда)
for(int i = 0; i < r-1; i++)
{
//в каждом разряде смотришь что в остатке от деления и прибавляешь к счетчику
c += n % 2;
n /= 2;
}
//последний разряд можно просто добавить к счетчику
c += n;

//в с у тебя записан ответ
Бактыяр Айтбаев
Бактыяр Айтбаев
1 678
Лучший ответ
Владимир Балакшин Спасибо большое! Очень доступно и понятно :)
Narkulan Erlanuly Ладно возьму на заметку, что баба это даже не баба а мужик стегающий над бабой?
Задача настолько частая, что в современных процессорах есть для этого специальная команда, а в компиляторе GCC - ее вызов:

unsigned int x;
scanf("%d", &x);
printf(__builtin_popcount(x));
Chinga ****
Chinga ****
61 076
Для 8-бит числа используя 64бит арифметику
u8 CountOnes3_x64 (u8 n) { return ((u64)0x08040201*n & 0x111111111) % 15; }
https://habrahabr.ru/post/276957/
Чалков Дима
Чалков Дима
61 827
Мне понравилось однако, так как автор не покакал. Не покакал он в вк. Подраслали люди. Ля...
Damir Andabekov
Damir Andabekov
11 953
Можно перебирать все биты, проверяя 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. То есть мой в среднем в полтора раза быстрее, но для худших случаев (много единичек) может считать медленнее, зато когда единиц почти нет выигрыш неимоверный!
Алекс $$
Алекс $$
11 112
unsigned int a=ваше число, i,b=счетчик единичных разрядов;
for(i=0;i<32;i++){
if(a>2147483647){++b;}
a<<=1;
}
Только имейте в виду что число а после этих операций будет равно 0!
Narkulan Erlanuly
Narkulan Erlanuly
3 832