3

最適化アプローチに関するいくつかの問題を読んでいます。
特定の範囲で数値をソートする方法の問題では、解決策はビットマップを使用することです。また、数値が最大 10 回表示される場合は、半バイトを使用して数値をマップし、発生回数を表すカウンターとして使用します。
コンセプトよくわかります。私の問題は、これをJavaで簡単に実装する方法です。

私はビット操作で立ち往生しています。
たとえば、カウンターを 1 ずつインクリメントする最初の部分については、次のように考えることができました。

バイトを見つけます。
たとえば、下位ビットを取得するためにbitValue[i]
実行byte tmp = bitValue[i] & 0x0Fします (カウンターが下位カウンターの場合)。
次に dotmp = tmp + 1で 1 ずつインクリメントします。
次に dobitValue[i] >> 2で下位ビットをクリアしbitValue[i] <<2てから元に戻します。これで、オリジナルと同じ上位ビットと下位ビットがクリアされました。
次にbitValue[i] |= tmp、下位ビットを設定します。これで、下位ビット カウンターが 1 ずつインクリメントされました
bitValue

上位ビットの場合は同じプロセスになりますが、上位ビットの場合です。

次に、カウンターの数を確認する必要があります。

bitmasks:
0x0 0x1 0x2etc を使用ORして、現在のカウンター番号を確認することを考えました。

これらはすべて複雑すぎるようです。私は正しい軌道に乗っていますか?これらの操作は、Javaコーディングでどのように対処するのが最適ですか?

これに関する任意の入力、ガイダンスは大歓迎です。

4

1 に答える 1

3

あなたは間違いなく正しい方向に進んでいます。これは、の最初の4ビットまたは次の4ビットをint指定された量だけインクリメントする具体化されたコードです。

intここでは。の代わりに使用していることに注意してくださいbyte。データがである場合でも、byte通常はとして使用する方がはるかに簡単intです。これは、Javaのビット演算子|がand&<<returnのようなものであるためintです。したがって、データを操作するのが最も簡単でint、少し手を加えたらキャストバックします。

また、ビットごとのレベルで大量のデータ(おそらく、言及した2つのカウンター以上)を処理する必要がある場合は、BitSetを検討することを検討してください。

public class Test {
    public static void main(String[] args)
    {
        int counter = 0;

        // increment the low bits by 3 and high bits by 2
        counter = addLowBits( counter, 3 );
        counter = addHighBits( counter, 2 );

        // print the hex string to verify
        System.out.println( Integer.toHexString( counter ) );
        System.out.println( "Low Counter: " + ( counter & 0x0F ) );
        System.out.println( "High Counter: " + ( ( counter & 0xF0 ) >> 4 ) );
    }

    public static int addLowBits( int counter, int increment )
    {
        // get the low bits
        int low = counter & 0x0F;

        // increment by 1
        low = low + increment;

        // mask the high bits and insert new low bits
        counter = (counter & 0xF0) | low;

        return counter;
    }

    public static int addHighBits( int counter, int increment )
    {
        // now get high bits
        int high = ( counter & 0xF0 ) >> 4;

        // increment by 1
        high = high + increment;

        // mask the low bits and insert new high bits
        counter = (counter & 0x0F) | ( high << 4 );

        return counter;
    }
}
于 2012-04-02T19:59:22.500 に答える