4

如何在 C 中快速找到 2^x。如果你们有任何想法,请提供帮助。

4

6 回答 6

13

是整数还是浮点数?对于 int,使用左移。对于浮点数,pow() 函数

于 2012-09-07T03:43:28.843 回答
11

向左位移,这将数字乘以 2,每次位移,就像将十进制数字向左移动会使它们乘以 10。

使用<<运算符,如下所示:

int twoPowZero = 1; // any number^0 is 1
int twoPowOne  = 1 << 1; // this sets the '2' bit to '1'
int twoPowTwo  = 1 << 2;
int twoPowFive = 1 << 5;
int twoPowTen  = 1 << 10;

依此类推,直到您到达1 << 30. 如果您使用带符号的 32 位整数,那么1 << 31由于二进制补码,您将得到 -2147483648。如果要高于使用long long unsigned intuint64_t(64 位整数)。或者,如果您的平台支持:uint128_t.

如果你想走得更高,你需要滚动你自己的“大整数”代码。请注意,某些平台和编译器带有 128 位整数类型,但运行时性能各不相同:它们可能需要一个可以执行 128 位操作的处理器,或者它们可能会将其分解为两个 64 位操作。

于 2012-09-07T03:44:49.137 回答
4

回想一下,在二进制系统中,某个位置的位N表示2^N。因此,正数的公式int

1 << x
于 2012-09-07T03:44:23.097 回答
3
#include <stdio.h>
#include <math.h>

int main ()
{
  printf ("7.0 ^ 3 = %lf\n", pow (7.0,3));
  printf ("4.73 ^ 12 = %lf\n", pow (4.73,12));
  printf ("32.01 ^ 1.54 = %lf\n", pow (32.01,1.54));
  return 0;
}

输出:

7.0 ^ 3 = 343.000000
4.73 ^ 12 = 125410439.217423
32.01 ^ 1.54 = 208.036691
于 2012-09-07T03:45:24.990 回答
3
 #include <math.h>
 float powf(float x, float y); /* C99 */
 double pow(double x, double y);
 long double powl(long double x, long double y); /* C99 */
于 2012-09-07T03:45:43.207 回答
3

1在第xth 位位置设置 a : 1 << x

在这种情况下x应该小于整数类型的宽度,并且x应该是正数。

于 2012-09-07T03:46:49.367 回答