Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
найти по числу m его максимальный делитель вида 2^n за время O(1)
m ^ (m & (m-1)).В таком графе, в каждую вершину входит два ребра и выходит два ребра, а значит существует Эйлеров цикл
n=(n&0x55555555)+((n>>1)&0x55555555);
n=(n&0x33333333)+((n>>2)&0x33333333);
n=(n+(n>>4))&0x0f0f0f0f;
n+=n>>8;
count=(n+(n>>16))&0xff;
А потом кто-то изобретёт 128-битный процессор.К этому есть какие-то предпосылки? Если 64 бита ещё как-то были оправданы адресацией памяти и расчётами с числами двойной точности, то применения 128-битам в ближайшие лет 20 я лично придумать не могу (даже с учётом предположения о росте требуемых объёмов памяти пропорционально росту вычислительных возможностей по закону Мура).
__builtin_popcount. Пусть компилятор соберёт оптимальный набор инструкций.mul/imul, примененная к 64х-разрядным операндам, дает 128и-битный результат. Тот факт, что старшая часть чаще всего отбрасывается, обусловлен системой типов языков высокого уровня, но на низком уровне такой проблемы не стоит.
Как найти показатель степени двойки за O(1) с помощью последовательности де Брёйна