2016-09-19 13 views
1

私は数字Xを持っていますが、2の累乗数を確認したいのですか?私はnext power of 22の累乗数を確認する

For Ex: 
N=14 Ans=16 

をチェックする例

N=7 ans is 2 , 2*2 
N=20 ans is 4, 2*2*2*2 
同様

については は、任意のビットがforループを使用せず、このためにハックありますか? 同様に、それが2の威力であるかどうかをチェックする1行の解決策を持っているようです。

+1

http://stackoverflow.com/questions/109023/how-to-count-the-number-of-set-bits-in-a-32-bit-integer –

+0

@AlexeyGuseynov i guessセットビットの数は私に正しい答えを与えません – user6250837

+0

この '10000000001'のようにsetbitは2だけです – user6250837

答えて

2

GCCには、先行ゼロの数を整数で返す__builtin_clz()という組み込み命令があります。たとえば、32ビットのintを仮定すると、式p = 32 - __builtin_clz(n)は、整数nを格納するために必要なビット数を示し、1 << pは2の次の最大累乗を与えます(p <、もちろん32)。

longlong longの整数で機能する同等の機能もあります。

また、math.hは、倍精度数の底2指数を返すfrexp()という関数を定義しています。この関数に渡す前に整数を倍精度値に変換する必要があるため、これは効率が悪い可能性があります。

0

数値は2進数で '1'が1つしかない場合、2の累乗です。たとえば、2 = 00000010,4 = 00000100,8 = 00001000などとなります。だからあなたはそれを数えてチェックすることができます。そのビット値には1の値が入ります。 countが1の場合、数値は2の累乗であり、その逆もあります。

設定ビットをカウントするためのループを避けるには、herehereの助けを借りてください。

countが1ではない(Valueが2の累乗でないことを意味する)場合、MSBからの最初のセットビットの位置をとり、2の次の累乗はこの数値にセットされたビット+位置1の値ですたとえば、番号3 = 00000011です。MSBからの最初のセットビットは2番目のビットです。したがって、2進数の次の累乗は、3番目の位置にビットをセットした値です。すなわち00000100 = 4.

関連する問題