C # математический вопрос: наименьшая степень 2 больше, чем X? - PullRequest
3 голосов
/ 02 апреля 2011
    public int CalcBrackets(int teamCount)
    {
        int positions = 1;

        while (positions < teamCount)
            positions *= 2;

        return positions;
    }

Я хочу наименьшее число, которое является степенью 2 и больше или равно teamCount. Это действительно лучший способ сделать это? Это выглядит ужасно: (

Ответы [ 5 ]

10 голосов
/ 02 апреля 2011

Если вам нужно рассчитать наименьшую мощность в 2 (а не в несколько раз) меньше, чем teamCount, то, возможно, это лучший способ.Взятие логарифма является дорогостоящей операцией и может занять больше времени, чем простой цикл.

upd Вот алгоритм (C ++), использующий побитовые операции (http://aggregate.org/MAGIC/, раздел Следующая наибольшая степень 2)

unsigned int nlpo2(unsigned int x)
{
    x--; // comment out to always take the next biggest power of two, even if x is already a power of two
    x |= (x >> 1);
    x |= (x >> 2);
    x |= (x >> 4);
    x |= (x >> 8);
    x |= (x >> 16);
    return (x+1);
}

Сначала он устанавливает все соответствующие биты числа в единицы (например, 0x3ff), а затем увеличивает его (0x400), чтобы получить степень двойки.

1 голос
/ 02 апреля 2011

То, что цикл while идет не по кратным двум, а по степеням два.

Если вам действительно нужно кратное, просто добавьте 1, разделите на 2, чтобы получить половину, а затем умножьтеобратно на два:

return ((teamCount+1)/2)*2

, чтобы, если оно было четным, вы получали обратно то же самое число, а если оно было нечетным, так как вы добавляете 1 и затем делите, вы получаете следующее четное число.*

1 голос
/ 02 апреля 2011

Наименьшее кратное

return (teamCount % 2 == 0 ? teamCount : teamCount + 1);

Наименьшее мощность , вы можете взять журналЧто-то вроде

2 ** (ceil(log_2(teamCount)))

Для подходящих функций ceil и log_2.Ваша техника в порядке, хотя.

0 голосов
/ 02 апреля 2011

Не больше, меньше, и если вы имеете в виду несколько 2 * 2 * 2 * 2 * log aritm лучший способ, это использовать функцию logaritma в базе 2 и округлить результат до нижней базы. вы 5, ххх округлите до 5.

0 голосов
/ 02 апреля 2011

этот способ достаточно прост:

if (teamCount % 2 == 0)
    return teamCount;
else
    return (teamCount + 1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...