0

intのビットが設定されているかどうかをチェックする関数があります。しかし、これは線形であり、最も効率的な実装にはなり得ないため、はるかに高速な実装があると思います。ただし、intは1から1024の間でなければなりません。

 public static int getBitPos(final int n) {
        if (Integer.bitCount(n) != 1)
            return Constants.UNDEFINED;
        else {
            for (int i = 0; i < Integer.MAX_VALUE; ++i) {
                if (testBit(n, i))
                    return i;
            }
        }
        return Constants.UNDEFINED;
    }

testBit次の標準関数はどこにありますか。

public static boolean testBit(final int n, final int pos) {
    int mask = 1 << pos;
    return (n & mask) == mask;
}

しかし、もっと速い方法がありますね。値が17で、4番目のビット(n = 8)が設定されているかどうかを知りたい場合はどうすればよいですか?n=8のビットが設定されているかどうかを確認するためのより高速な方法があるはずです...

あなたが私を助けることができることを願っています...

編集1: サポートに感謝します。コメントと回答は私に私の間違いをもたらしました。値を間違って設定していたため、必要以上に複雑になりました。私はビットシフトが得意ではありませんでした。2番目のビットを設定したい場合は、次のように値を設定します。

value = 2;

4番目のビットも設定したい場合は、4番目のビットに従って値を追加しました。

value += 8;

したがって、値は10で、2番目と4番目のビットが設定されました。そのため、ビット位置の代わりに、クラスに数値を保存しました(4番目のビットの4ではなく値として8)。これを変更した後、私は不要な機能を取り除くことができました。すべての助けをありがとう!

4

1 に答える 1

5

コードが1つしかない場合、コードは常に最下位ビットである1を返します。これを行うことで同じことを達成できます:

int foo = whatever;
int lowestSetBit = Integer.numberOfTrailingZeros(foo) + 1;

あなたのコードは

public static int getBitPos(final int n) {
    if (Integer.bitCount(n) == 1)
        return Integer.numberOfTrailingZeros(n) + 1;
    return Constants.UNDEFINED;
}
于 2012-12-10T16:15:32.277 に答える