Вы уже получили ответы исключительно для FP и исключительно для целых чисел.Вот один для числа FP, возведенного в целую степень:
double power(double x, int y) {
double z = 1.0;
while (y > 0) {
while (!(y&1)) {
y >>= 2;
x *= x;
}
--y;
z = x * z;
}
return z;
}
В данный момент используется умножение.Вы можете реализовать умножение, используя только сдвиги битов, сравнение нескольких битов и сложение.Для целых чисел это выглядит так:
int mul(int x, int y) {
int result = 0;
while (y) {
if (y&1)
result += x;
x <<= 1;
y >>= 1;
}
return result;
}
С плавающей точкой почти то же самое, за исключением того, что вы должны нормализовать свои результаты - т.е., по сути, число с плавающей запятой равно 1) значению и выражается как(обычно довольно большое) целое число и 2) коэффициент масштабирования.Если вы хотите получить нормальные числа с плавающей запятой IEEE, некоторые части становятся немного уродливыми - например, масштабный коэффициент сохраняется как число смещения вместо любого обычного дополнения 1, дополнения 2 и т. Д., Поэтомуработать с ним неуклюже (в основном, каждую операцию, которую вы вычитаете из смещения, выполняете операцию, проверяете на переполнение и (при условии, что она не переполнена) снова добавляете смещение).
Выполнение работыбез каких-либо логических тестов звучит (для меня), как будто это не было на самом деле предназначено.Для довольно многих классов компьютерной архитектуры интересно свести проблему к примитивным операциям, которые вы можете выразить непосредственно в аппаратном обеспечении (например, сдвиги битов, поразрядно - AND
, - OR
и - NOT
и т. Д.). Реализацияпоказанный выше пример вполне подходит (если вы хотите получить техническую информацию, сумматор занимает несколько ворот, но VHDL, Verilog и т. д., но в любом случае он включен в такие вещи, как VHDL и Verilog).