Я пытался реализовать алгоритм округления до 2, описанный в следующей ссылке в AS3.
http://graphics.stanford.edu/~seander/bithacks.html#RoundUpPowerOf2
public static function upperPowerOfTwo(num:uint):uint
{
// if(num == 1) return 2;
num--;
num |= num >> 1;
num |= num >> 2;
num |= num >> 4;
num |= num >> 8;
num |= num >> 16;
num++;
return num;
}
Алгоритм прекрасно работает для большинствазначения, которые я проверял.Упоминается, что это вернет 0, когда задано входное значение 0, что технически неверно, но я согласен с этим выводом.То, с чем я не в порядке, когда я получаю ввод 1, я получаю и вывод 1.
Я думаю, что это должно быть предостережение от AS3 и его вялой реализации Uint, но я не могучтобы понять это.Я также пытался использовать оператор логического сдвига >>> для того же результата.
Мой C немного ржавый, но я не уверен, как это могло бы даже вернуть 2 в C. Может кто-нибудь объяснить мнечто здесь не так?Я предполагаю, что если бы ввод 1 был особым случаем, он был бы упомянут в приведенной выше ссылке.