0

以下のような API を使用して、bytearray 内の特定のビットを変更できるヘルパー クラスを探しています。

void Set(int startPos, int lengthInBits, int value) {
  // Set the bits starting at startPos to the binary representation of value
  // Error if the binary representation of value is too long (ie. exceeds lengthInBits)
}

目的は、任意の長さの特定の値を bytearray に入れることができるようにすることです。一部の値の長さは 1 バイト未満であり、他の値はそれ以上になり、一部の値はバイトを「またぐ」ことになります。

私はByteBufferを見てきましたが、これは少しレベルが高すぎるようで、最大ビット数を選択させるのではなく、バイト全体を配置し、int と short を複数のバイトに変換するだけで動作します。

BitSetも調べましたが、今回は単一ビット レベルでしか機能しないため、少しレベルが低すぎるように見えます (ただし、上記の種類の API を使用して何かを構築するための出発点としてこれを使用できる可能性があります)。

主に符号付き/符号なしビットの使用に関連する、スタックオーバーフローに関する古いやや似た質問もありますが、描かれているデータ構造は、私が構築しようとしている種類のものです (外部クライアントに送信するメッセージ)、およびビットシフトの複雑さを可能な限り隠したいと思います。

4

2 に答える 2

0

それほど難しくありません。多分これは出発点としてあなたを助けることができます:

ByteBuffer data;

int getBits(int bitOff, int bitSize)
{
  if(bitSize>32) throw new UnsupportedOperationException();
  final int mask= bitSize==32? -1: (1<<bitSize)-1;
  return (int)((data.getLong(bitOff>>>3) >>> (64-bitSize-(bitOff&7))) & mask);
}
void putBits(int bitOff, int bitSize, int intValue)
{
  final int byteOff=bitOff>>>3;
  bitOff -= byteOff<<3;
  final int shift = 64-bitSize-bitOff;
  long mask=Long.rotateLeft((-1L)<<bitSize, shift), lValue=intValue&0xffffffffL;
  data.putLong(byteOff, (lValue << shift) | (data.getLong(byteOff)&mask));
}
于 2013-10-28T14:52:27.637 に答える
0

java.util.BitSet を拡張できます。これは、すでに任意の数のビットのストレージを処理しています。追加する必要があるのは、一括 get/set 操作だけです。

public class BulkBitSet extends BitSet {

    public void bulkSet(int offset, int count, int data) {
        int ptr = offset + count;
        for (int i=0; i<count; ++i) {
            set(--ptr, (data & (1 << i)) == 0 ? false : true);
        }
    }

    public int bulkGet(int offset, int count) {
        int result = 0;
        for (int i=0; i<count; ++i) {
            result <<= 1;
            if (get(offset + i))
                result |= 1;
        }
        return result;
    }

}
于 2013-10-28T16:32:04.730 に答える