Легкий способ вычисления целых степеней 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();