Как использовать повышение до степени х в с - PullRequest
5 голосов
/ 18 сентября 2011

Мой вопрос: как мне вычислить 2 ^ (x) в c. Я знаю, что есть нечто вроде сдвига, которое делает то же самое. Я пытался сделать total = x << 1, но это не сработало. Я знаю, что если я сдвину один бит, это то же самое, что умножить его на два. Или что-то в этом роде. </p>

int x;

for(x=0; x<4; x++){

total += x <<1; // 

}

Когда это будет выполнено, я ожидаю, что общая сумма составит 15 (2 0 + 2 1 + 2 2 + 2 3 )

Есть идеи, что я делаю не так? мой итог начинается с 0, а затем портится.

Спасибо!

Ответы [ 3 ]

22 голосов
/ 18 сентября 2011

Это наоборот. 1 << x даст вам '2 ^ x'.

2 голосов
/ 18 сентября 2011

Сдвиг влево ограничен размером слова вашего процессора, 32 или 64 бита, что ограничивает максимальный показатель, который вы можете безопасно использовать, до того, как результат будет неопределенным (2 ^ 31 или 2 ^ 63).

Следующее работает для больших показателей, но использует арифметику с плавающей запятой.Если вам нужны точные результаты, вам следует подумать об использовании математической библиотеки с бесконечной точностью, такой как GMP

#include <math.h>

int main() {
  double base = 2;
  double exponent = 4;

  double result = pow(base, exponent);

  return 0;
}
2 голосов
/ 18 сентября 2011

Это должно делать то, что вы хотите. Звоните pow(2, x), чтобы получить 2 х .

int abs (int x) {
  if (x < 0) return -x;
  return x;
}

int signum (int x) {
  if (x < 0) return -1;
  if (x > 0) return 1;
  return 0;
}

int add (int x, int y) {
  for (int i = 0; i < abs(y); ++i) {
    if (y > 0) ++x;
    else --x;
  }
  return x;
}

int mult (int x, int y) {
  int sign = signum(x) * signum(y);
  x = abs(x);
  y = abs(y);
  int res = 0;
  for (int i = 0; i < y; ++i) {
    res = add(res, x);
  }
  return sign * res;
}

int pow (int x, int y) {
  if (y < 0) return 0;
  int res = 1;
  for (int i = 0; i < y; ++i) {
    res = mult(res, x);
  }
  return res;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...