私は10進数のセットを持っています。それぞれに特定のビットが設定されているかどうかを確認する必要があります。ビットが設定されている場合は1を返す必要があり、そうでない場合は0を返す必要があり
ます。これを行うための簡単で高速な方法を探しています。
たとえば、3番目のビットが設定されているかどうかを確認しているとします。(number AND(2 ^ 2))を実行できます。ビットが設定されている場合は、4を返します。それ以外の場合は、0を返します。4ではなく1を返すようにするにはどうすればよいですか。
ありがとうございました!
5 に答える
除算のソリューションは単純なものですが、ビットシフト演算の方が効率的だと思います。ただし、確認するにはテストする必要があります。たとえば、1 ベースのビット インデックスを使用している場合は、次のようにすることができます。
Dim oneOrZero As Integer = (k And 2 ^ (n - 1)) >> (n - 1)
(ここで、k は数値、n はビット インデックスです)。0 ベースのビット インデックスを使用している場合は、次のようにします。
Dim oneOrZero As Integer = (k And 2 ^ n) >> n
if ((number AND (2^bitnumber) <> 0) then return 1 else return 0 end if
戻り値の型をブール値に変更できる場合、これはよりエレガントです
return ((number AND (2^bitnumber)) <> 0)
すみません、皆さん、今日は遅すぎます。
10 進数 "k" のビット番号 "n" をテストするには:
(k AND 2^(n-1))/(2^(n-1))
は、ビットが設定されている場合は 1 を返し、それ以外の場合は 0 を返します。
=============================================== _
====
皆さん、こんにちは!
提案された 3つの
ソリューション
のパフォーマンスを 0 から始まるインデックスで比較しました。結果は次のとおり
です
。は、4 回の連続実行の平均です。
驚いたことに、2 番目のソリューションは 3 番目のソリューションよりも優れていました。
ただし、「除算ソリューション」を次のように変更した後:
p = 2 ^ n : oneOrZero = (k And p) / p
7.48 秒で実行を開始しました。
したがって、これは提案されたソリューションの中で最速です (Keith の発言にもかかわらず :-)。
みんな助けてくれてありがとう!