Pull to refresh

Comments 8

Спасибо за статью!

В теле цикла обнаружено объявление переменной 'it', совпадающей с переменной, используемой для контроля цикла. Такой код может содержать логические ошибки, вплоть до получения вечного цикла.
Конечно, ад, что стандарт языка такое допускает.
int
compute_order(unsigned long size)
{
  int  order;
  unsigned long tmp;
  for (order = 0, tmp = size; tmp >>= 1; ++order); //<==
    if (size & ~(1 << order))
      ++order;
    return order;
}

Форматирование странное, но код рабочий. Хотели как лучше, видимо, а получилось как всегда.
В этом цикле вычисляется номер старшего установленного разряда. То исть исходное число сдвигается до тех пор, пока не станет равным нулю (tmp >>= 1) и считается количество итераций (++order).
for (order = 0, tmp = size; tmp >>= 1; ++order);
А этот код
if (size & ~(1 << order))
  ++order;
выполняет округление к большему.

По сути это ceil(log2(N)), часто встречаемая конструкция для вычисления необходимого количества бит для кодирования N различных элементов.
Было бы интересно посмотреть на результаты анализа helenos.org сейчас это единственная (полу)живая альтернативная ОС кроме такой же полуживой Haiku.
А мне интересен результат анализа какой-нибудь BSD системы, лучше NetBSD. А то БСДшникам обидно. На мой взгляд, у них очень качественный код, возможно, из-за своей консервативности.
Если говорить про альтернативные, как же AROS(клон AmigaOS)? По крайней мере дистрибутив Icaros довольно активно развивается.
UFO just landed and posted this here
Sign up to leave a comment.