4

バイト配列に単一ビットを挿入しようとしています。これにより、バイト配列内のすべてのビットが左にシフトします。

次のような Java バイト配列があるとします。

byte[] byteArray = new byte[2];
byteArray[0] = 0x11
byteArray[1] = 0x00

バイナリでは、このバイト配列は次のように表されます。

0001 0001 0000 0000

ここで、3 番目のビット位置にゼロを挿入したい (バイト配列の最後のビットを失う) と、次のようになります。

0000 1000 1000 0000

Javaでこれを行う簡単な方法はありますか? バイト配列全体をバイナリ文字列に変換できる BigInteger クラスを認識していますが(その方法で挿入して元に戻す)、効率が悪いようです。

前もって感謝します。

4

4 に答える 4

7

トリッキーなビットは、ビットの一部だけをシフトしたいので、実際にビットを挿入したい場所に文字をシフトすることです。これは、次のような関数を使用して実行できます。

public static char shift(char in, char n, char v)
{
    char lowMask = (1 << n) - 1;
    char highMask = 0xFF ^ lowMask;

    return (in & lowMask) | ((in & highMask) << 1) | ((v&1) << n);
}

最初の文字にビットを挿入した後、配列の残りの部分もシフトする必要があります。これは、1ビットを右にシフト(<< 1)し、次の文字の最下位ビット(LSB)を最後の文字の最上位ビット(MSB)の状態に設定するだけで実行できます。

于 2009-05-27T17:19:18.537 に答える
2

ビットマスキングとビットシフトを使用したいと思うでしょう。Java ドキュメントの次の部分が役立つ場合があります。

http://72.5.124.55/docs/books/tutorial/java/nutsandbolts/op3.html

正確には、バイト配列を整数に変換し、最下位ビットの変数を作成してコピーし、元の変数からそれらのビットをビットマスク アウト (AND マスクを使用) したいと思うでしょう。元の変数をビットシフトしてから、保存した下位ビットを (OR マスクを使用して) ビットマスクします。

于 2009-05-27T16:50:42.087 に答える
1

BitSetクラスを確認してください。それはあなたが必要とすることをかなり簡単に行うことができます。

于 2009-05-27T17:06:09.530 に答える
0

ここでのこの関数は1バイトで機能します。もっと大きなことをする必要がある場合は、UnicodeCHARに変換できます。

static byte InsertBit(byte original, byte location)
        {
            byte highBits=original & ~(1<<location-1) ;
            byte lowBits = (1 << location - 1) & (original >> 1);

            return (1<< location) | highBits |lowBits;
        }
于 2009-10-25T03:45:24.020 に答える