Легкий способ вычисления целых степеней 2 в С#?

Я уверен, что это не так сложно, как я это делаю.

Хотелось бы использовать нечто, эквивалентное Math.Pow(double, double), но выводив целое число. Меня беспокоят ошибки округления с плавающими точками.

Лучшее, что я могу придумать, это:

uint myPower = 12;
uint myPowerOfTwo = (uint)Math.Pow(2.0, (double)myPower);

Я подумал об этом:

uint myPowerOfTwo = 1 << myPower;    // doesn't work

но я получаю ошибку, что оператор "< < не может использоваться с операндами типа int или и uint.

Любые предложения? Спасибо, как всегда.

Ответ 1

вам нужно будет использовать целое число со знаком для второго операнда (справа) оператора сдвига:

int myPower = 12;
int myPowerOfTwo = 1 << myPower;   

Конечно, вы можете применить результат к другому числовому типу, например uint:

uint myPowerOfTwo = (uint) (1 << myPower);   

От MSDN:

Оператор левого сдвига (< <) сдвигаетс его первый операнд, оставленный номером бит, указанный его вторым операнд. Тип второго операнда должен быть int.

Ответ 2

Если вы сделаете добавочный/статический метод, тогда было бы легче найти и исправить любые ошибки позже, и оптимизатор все равно включит его:

public static uint Exp2(this uint exponent) {
    return (uint)Math.Pow(2.0, (double)exponent);
}

Затем вы можете использовать как:

uint myPowerOfTwo = myPower.Exp2();