Кількість одиничних бітів - stack overflow російською

Привіт таке питання.

Необхідно підрахувати кількість одиничних бітів в числі типу int (java). Одним з рішень, наприклад, є метод (зі статті на одному сайті про побітові операції):

Тут все зрозуміло: перевіряємо молодший біт побітовим і з 1 і після зрушуємо біти вправо із заповненням нулями, в результаті доходимо до нуля і отримуємо кількість 1 бітів.

І ось в статті далі йде ще більш покращене рішення, не можу його зрозуміти в одному місці:

Написано: "Для цього розглянемо вираз число (n - 1). Це число, відрізняється від n тим, що замість останнього одиничного біта у нього 0, а всі наступні біти рівні 1".

Власне тут не можу зрозуміти. Ну n = 5 або n = 0b101 і n-1 = 4 або n-1 = 0b100, тобто 101 і 100.

Я не бачу цитую "відрізняється від n тим, що замість останнього одиничного біта у нього 0, а всі наступні біти рівні 1". Молодший біт дорівнює 0 у четвірки, але наступний теж 0 а не 1.

Десь я туплю, але я не розумію, як n = n (N - 1) працює. За висловом count ++ очевидно, що при кожній ітерації у нас гарантовано виходить відрахувати одиничний біт.

Підкажіть, в чому суть, і вибачте за стіну тексту.

Про останній зрозумів, про операцію теж зрозуміло, але все одно в цілому не до кінця. Зрушувати вправо і порівнювати молодший біт 1 в голові очевидно сприймається. Виходить що (n-1) це теж що і n, але останній одиничний біт тут 0, а оскільки після операції в такому випадку - цей 0 з числа (n-1) і одиничний біт з n дасть завжди 0, то ми грубо кажучи відкушуємо на кожній ітерації 1 одиничний біт (який останній у числа n замінюючи його 0, поки не перетворимо все в 0) . Правильно я зрозумів?) - dMdS 28 Жовтня '14 о 20:53