Задача кодирования: подсчитайте один бит в числе.
Учитывая тридцатидвухразрядное целочисленное значение в качестве параметра, напишите функцию или метод, чтобы вернуть число битов "1" в этом числе.
Поэтому, если вы передадите 42, он должен вернуть 3-42 десятичных знака-это 2A шестнадцатеричных или 101010 двоичных-следовательно, 3 "1" бита.
Особое внимание следует уделить тому, чтобы сделать его как можно более эффективным: петли-плохая идея!
Что я уже пробовал:
Постановка задачи в первый раз в жизни!
гостиная[^]
Richard Deeming
СПОЙЛЕР! :)
Это будет тривиально в Ява[^] и С++[^]! :)
Я предполагаю, что какая-то вариация метод Стэндфорда[^] будет работать лучше всего для других языков.
OriginalGriff
Может быть, тривиально - это зависит от того, кто написал функции и какой метод они использовали. Посмотрите на решение номер один, которое* выглядит * эффективным, пока вы не подумаете о том, что происходит за кулисами.
Richard Deeming
Я считаю, что C++ просто называет popcnt
инструкция по поддерживаемым процессорам, которая примерно так же эффективна, как вы можете получить. :)
Jochen Arndt
Я все еще тестировал свой код, пока вы это писали :)
А если POPCNT не поддерживается, то есть (вероятно) хорошо известная страница о битных твид-хаках
Richard Deeming
Я не могу ни подтвердить, ни опровергнуть, что известная страница существует, ни что есть ссылка на нее в тексте спойлера выше. :)
Jochen Arndt
Уупс.
Я не видел и не испортил этого (прокрутил только немного вверх после публикации моего решения и распиливания вашего последнего комментария).
Chris Maunder
Это заставляет меня хотеть добавить большие пальцы вверх к комментариям ;)
PIEBALDconsult
С какой целью?
Richard Deeming
Для секретный генеральный план[^]:
Фаза 1) Подсчитайте количество битов " on " в 32-битном целочисленном числе.
Фаза 2) ???
Фаза 3) Прибыль!
:)
OriginalGriff
Фаза 3) мировое господство.
FTFY!
OriginalGriff
Он используется для измерения расстояния Хэмминга и для криптоанализа.
Кроме того, решение" немного крутить " - это замечательный образ мышления!