На собеседовании на позицию младшего продуктового аналитика, помимо всех прочих, была задана следущая задача:
"При регистрации пользователь может выбрать сразу несколько целей для знакомства из следующих: "Создание семьи", "Дружба", "Флирт",... (всего n типов) При этом на сервер передается двоичным кодом, например код 101 означает, что выбраны "Создание семьи" и "Флирт". А в таблицы к аналитикам попадает десятичное число. В данном случае просто число "5". Как применяя при вычислениях только выделение целой части (int(*)) и элементарные умножение, деление, нахождение суммы, разности чисел и возведение в степень, из кодов целей в таблице аналитиков, вычислять выбрана ли i-я по номеру цель? (Например, i=3 "Флирт".)
Написать формулу, где x-код у аналитиков, i - номер цели (то есть формула должна зависеть от x и i)"
Сколько не мучился, придумать нужную формулу так и не получилось.
Благодарю Вас за предложенное решение, но если бы речь шла о написании программы, то я бы тоже с этим справился)
Там запрос был именно математическую формулу вывести, что и создает всю сложность задания.
если не влезать в битовые составляющие, что нет в алгебре.
взять полную таблицу типа
Создание семьи = 4 (2^3)
Дружба = 2 (2^2)
Флирт = 1 (2^1)
и пройтись циклом с больших чисел таблички до малых.
если больше какого-то числа таблички, x > 4, то значит "Создание семьи" есть, вычитаем x - 4 и переходим к следующей итерации.
pfg21, скорее всего, от автора всё же хотели формулу на перечисленных операциях без ветвлений. Не зря же там даже целочисленное деление явно было заложено.
мне кажется, вопрошавший просто хотел услышать "перевести число обратно в двоичную форму и проверить позицию нужного бита". У меня есть "академично-математично" выглядящая идея, но это извращение; если бы мне кандидат такое предложил ( не как шутку, а на полном серьёзе), я бы его точно не взял.
Для этой задачи значительно удобнее использовать бинарные( битовые ) операции если они поддерживаются. Конкретно в этом случае and.
Делаете "маску", выполняете and маски и входного значения, если выход отличный от нуля, значит в нужной позиции стоит единица.