快速找到2 ^ x的方法

RBS*_*RBS 4 c c++

如何在C中快速找到2 ^ x.如果你们有任何想法请帮忙.

kel*_*tar 13

是int还是float?对于int,使用左移.对于float,pow()函数


Dai*_*Dai 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;
Run Code Online (Sandbox Code Playgroud)

等等,直到你到达1 << 30.如果你使用的是带符号的32位整数,1 << 31则会因为2的补码而给你-2147483648.如果你想要高于使用long long unsigned intuint64_t(64位整数).或者,如果您的平台支持它:uint128_t.

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

  • 1 << 31不太可能给你-1.它可能会给你MININT(一个非常大的负数).在我的经验中1 <<(超过31)的效果可以给你0或1,但实际行为是(IIRC)未定义,并且可以给你任何感觉. (3认同)
  • "1 << 31将给你-1"可能,但在C或C++中都没有保证.有符号整数溢出未定义. (2认同)