8

64 ビット整数内のビットを使用してフラグを格納します。
64ビット整数内の位置に関係なく、単一のビットが設定されているかどうかを知りたいです(特定のビットの位置は気にしません)。

boolean isOneSingleBitSet (long integer64)
{
   return ....;
}

Bit Twiddling Hacks (by Sean Eron Anderson)を使用してビット数を数えることはできますが、1 つのビットが設定されているかどうかを検出する最も効率的な方法は何だろう...

私はいくつかの他の関連する質問を見つけました:

また、いくつかのウィキペディアのページ:

注意: 私のアプリケーションは Java ですが、他の言語を使用した最適化に興味があります...


EDIT : Lưu Vĩnh Phúc私の質問内の最初のリンクが既に答えを得ていることを指摘しました: セクションを参照してください。1 ビットが2 の累乗と同じであることを知りませんでした。

4

6 に答える 6

23

文字通り 1 つのビットが設定されているかどうかを確認したい場合は、基本的に数値が 2 のべき乗であるかどうかを確認しています。これを行うには、次のようにします。

if ((number & (number-1)) == 0) ...

これも 0 を 2 のべき乗としてカウントするため、重要な場合は 0 でない数値を確認する必要があります。それで:

if (number != 0 && (number & (number-1)) == 0) ...
于 2012-11-16T16:18:24.517 に答える
16

(引数として x を使用)

少なくとも 1 つのビットが設定されているかどうかを検出するのは簡単です。

return x!=0;

同様に、ビット 1 (2 番目に低いビット) が設定されているかどうかを検出するのは簡単です。

return (x&2)!=0;

2 のべき乗である場合、正確に 1 ビットが設定されます。これは機能します:

return x!=0 && (x & (x-1))==0;
于 2012-11-16T16:21:18.450 に答える
3

ラッパー クラスには、long (64 ビット int) のビット数を返すjava.lang.Long静的関数があります。bitCount()

boolean isSingleBitSet(long l)
{
     return Long.bitCount(l) == 1;
}

int は Java では 32 ビットであることに注意してください。

于 2012-11-16T16:18:03.753 に答える
2

X が、探しているものを除いて 0 でいっぱいの 64 ビット インターであると仮定します。

  return ((64bitinteger&X)==X)
于 2012-11-16T16:20:14.070 に答える
1

ffs()最初のセットを見つけるの効率的な (またはハードウェアの) 実装が既にあると仮定すると、次のように行動できます。

bool isOneSingleBitSet (long integer64)
{
   return (integer64 >> ffs(integer64)) == 0;
}

この機能はすでに利用可能であるか、上記の独自のリンクffs()を表示したい場合があります

于 2012-11-16T16:17:02.367 に答える
0

longチェックしたい単一ビットの表現でビットごとの AND を実行できるようです。たとえば、LSB を確認するには

return(   (integer64 & 1L)!=0  );

または、右から 4 番目のビットを確認するには

return(   (integer64 & 8L)!=0  );
于 2012-11-16T16:18:46.670 に答える