Cで2^xをすばやく見つける方法。何かアイデアがあれば、助けてください。
6 に答える
それはintですか、それともfloatですか?intには、左シフトを使用します。floatの場合、pow()関数
左にビットシフトすると、10進数を左にシフトすると10が乗算されるのと同じように、場所がシフトするたびに数値が2倍になります。
<<
次のように演算子を使用します。
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
、2の補数のため、-2147483648になります。long long unsigned int
またはuint64_t
(64ビット整数)を使用するよりも高くしたい場合。または、プラットフォームがそれをサポートしている場合:uint128_t
。
さらに高くしたい場合は、独自の「大きな整数」コードをロールする必要があります。一部のプラットフォームとコンパイラには128ビット整数型が付属していますが、実行時のパフォーマンスは異なります。128ビット操作を実行できるプロセッサが必要な場合や、2つの64ビット操作に分割される場合があります。
N
バイナリシステムでは、位置のビットがを表すことを思い出してください2^N
。したがって、正の式int
は次のようになります。
1 << x
#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
#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 */
1
aをx
thビット位置に設定します1 << x
。
この場合x
、整数型の幅より小さく、x
正の値にする必要があります。