5

私が取り組んでいるいくつかのコードでは、2 つの値 (0 または 1) のいずれかを取ることができる 10 個の独立したパラメーターを処理する必要があります。これにより、2^10 の異なる条件が作成されます。いくつかの条件は決して発生せず、除外することができますが、発生する条件は依然として多く、switchすべてのケースを処理するために を作成するのは正気ではありません。

if巨大な の代わりに10 個のステートメントを使用したいswitch。このためには、フラグビットを使用する必要があることを知っています。言語はjavascriptであり、10ビットバイナリを表すために10バイト文字列を操作する方が簡単であるため、フラグバイトを使用する必要があります。

さて、私の問題は、これを実装する方法がわからないことです。API複数選択可能なオプションが 1, 2, 4, 8, ... , n^(n-1) で公開されている s で使用されているのを見たことがあります。バイナリで。したがって、 のような呼び出しを行うとbar = foo(7)、 bar は右端の 3 つのフラグが有効にするオプションを持つオブジェクトになります。

10 進数を 2 進数に変換し、各ifステートメントで対応する数字が設定されているかどうかを確認できます。しかし、実際に変換を行わずに、10 進数の桁が 0 か 2 進数の 1かを判断する方法はあるのでしょうか?n-th

4

3 に答える 3

6

ビット単位の and を使用するだけです。C/C++ では、次のようになります。

if (flags & 1) {
    // Bit zero is set.
}
if (flags & 2) {
    // Bit one is set.
}
if (flags & 4) {
    // Bit two is set.
}
...

生産性を高めるために、1、2、4、8 などのマジック ナンバーの代わりに、フラグ マスクに記号名を使用します。

フラグが何らかの形で均一で (たとえば、ジオメトリの問題で 10 の空間次元を表す)、各ケースを処理するコードが同じである場合は、ループを使用できます。

for (int f = 0; f < 10; ++f) {
    if (flags & (1 << f)) {
        // Bit f is set.
    }
}
于 2010-04-25T07:20:55.280 に答える
2

ビットごとに使用できます。

10 & 2^1 is true because 10 = 1010b 
                                ^ 1
 8 & 2^1 is false because 8 = 1000b 
                                ^ 0
10 & 2^3 is true because 10 = 1010b 
                              ^ 1
于 2010-04-25T07:26:27.517 に答える
1

n 番目のビットが設定された数値を取得し、それを自分の数値と AND することができます。結果がゼロの場合、数値にはビットが設定されていません。そうでなければ、そうでした。こちらもご覧ください。

于 2010-04-25T07:21:41.177 に答える