0

私のアプリケーション データの一部には、9 つ​​の 3 進数 (base-3) の「ビット」のセットが含まれています。データベースのデータをコンパクトに保つ​​ために、そのデータを単一の短いものとして保存したいと思います。3^9 < 2^15 であるため、9 桁の 3 進数を短縮形で表すことができます。

私の現在の方法は、長さ 9 の文字列として処理することです。任意の数字をインデックスで読み取ったり設定したりできます。これは便利で簡単です。ただし、それを short に変換するために、現在、手動で (シフト加算ループを使用して) base 10 に変換し、次に Int16.Parse を使用してバイナリ short に変換しています。格納された値を基数 3 の文字列に戻すには、プロセスを逆に実行します。これにはすべて時間がかかるため、可能であれば最適化したいと考えています。

私がやりたいことは、常に値を short として保存し、3 進数のビットを読み取って設定することです。理想的には、バイナリから個々の数字を取得して設定する関数が必要です。

いくつかのビット シフトと mod 関数で遊んでみましたが、これを行う正しい方法が思い浮かびませんでした。完全な変換を行わずにそれが可能かどうかさえわかりません。

これに役立つビット単位の算術魔法を教えてくれる人はいますか?

4

3 に答える 3

1
public class Base3Handler
{
    private static int[] idx = {1, 3, 9, 27, 81, 243, 729, 729*3, 729*9, 729*81};

    public static byte ReadBase3Bit(short n, byte position)
    {
        if ((position > 8) || (position < 0))
            throw new Exception("Out of range...");
        return (byte)((n%idx[position + 1])/idx[position]);
    }

    public static short WriteBase3Bit(short n, byte position, byte newBit)
    {
        byte oldBit = ReadBase3Bit(n, position);
        return (short) (n + (newBit - oldBit)*idx[position]);
    }
}
于 2011-05-29T20:40:49.690 に答える
0

これらは小さな数字です。それらを必要に応じて効率的にメモリに保存しますが、必要に応じてテーブルルックアップを使用してある形式から別の形式に変換します。

于 2011-05-30T16:18:43.487 に答える
-1

3 値に対してビット操作を行うことはできません。値を抽出して結合するには、乗算、除算、モジュロを使用する必要があります。

ビット操作を使用するには、パッキングを short ごとに 8 つの ternaries (つまり、それぞれ 2 ビット) に制限する必要があります。

于 2011-05-29T20:38:42.683 に答える