Есть функция
void ClipToPower2(dword& dwValue)
{
dwValue |= (dwValue >> 16);
dwValue |= (dwValue >> 8);
dwValue |= (dwValue >> 4);
dwValue |= (dwValue >> 2);
dwValue |= (dwValue >> 1);
dwValue += 1;
}
, в теле которой развернут цикл
for(dword dwIndex = ((8 * sizeof(dword) >> 1)); dwIndex > 0; dwIndex >>= 1)
dwNumber |= (dwNumber >> dwIndex);
dwNumber += 1;
. Так вот, можно ли считать следующий код
template <mword t_wmID> struct switch_id
{
enum identifier { id = t_wmID };
};
template <typename T>
inline void ClipToPower2(T& tNumber)
{
return ClipToPower2<T>(tNumber, switch_id<(8 * sizeof(T))>());
}
template <typename T, mword t_mwIndex>
inline void ClipToPower2(T& tNumber, switch_id<t_mwIndex>)
{
ClipToPower2<T>((tNumber |= tNumber >> (t_mwIndex >> 1))
, switch_id<(t_mwIndex >> 1)>());
}
template <typename T>
inline void ClipToPower2(T& tNumber, switch_id<0>)
{
tNumber += 1;
}
полноценным заменителем первой функции? Я говорю о производительности... К сожалению нет под рукой профайлера, поэтому обращаюсь сюда.
Мой компьютер прогоняет бесконечный цикл за 9 секунд, но, мне кажется, он мог бы сделать это быстрее...