Здравствуй, лор.
На днях при программировании сигнального процессора встретился с примерно следующей задачкой:
Программистам довольно часто требуются функции ffs и fls, которые ищут в двоичном представлении целого числа первый и последний биты соответственно, установленные в 1. Например ffs(1)=0, ffs(2)=1, ffs(3)=0, ffs(4)=2, ffs(5)=0 и т.д. fls(1)=0, fls(2)=1, fls(3)=1, fls(4)=2, fls(5)=2 и т.д.
Так вот, попался мне процессор самый обыкновенный. В нём есть команда, выполняющая для заданного числа fls. А мне потребовался ffs. И нет ротации последовательности бит. Помимо этой команды fls имеется так же полный комплект: целочисленная арифметика, логика, проверки, переходы, обращение к памяти. Регистров штук 10. Достаточно одним словом.
Я получил крайне элегантное решение проблемы, найдя в таких условиях алгоритм для вычисления fls со сложностью O(1). Решение это поистине банально и элементарно, но немного не тривиально.
Предлагаю всем желающим поупражняться в изворотливости мозга (щито?) и попытаться это решение найти. Ну а если не получится, то я его через некоторое время и опишу.