7

ビットの範囲を取得できる方法を探しています。たとえば、バイナリデータがある場合

0 1 0 1 1 0 1 1 1 1 0 1 0 1 1 1 (2バイト)

ビット 3 から 9 の範囲のデータを取得する必要があるかもしれません。つまり、次のことに興味があります。

0 1 0 1 1 0 1 1 1 1 0 1 01 1 1

要するに、私はメソッドを構築したいと思います:

 byte[] Read(byte[] data, int left, int right){ 

     // implementation
 }

そのため、データを渡すnew byte[]{91,215}, 3, 9 と取得されますbyte[]{122} (バイト91と215 =0 1 0 1 1 0 1 1 1 1 0 1 0 1 1 1およびバイト122 =1 1 1 1 0 1 0例と同じバイナリデータに注意してください。

<<次のようなバイト配列で演算子を使用できればいいのですが。

  byte[] myArray = new byte[] { 1, 2, 3 };
  var shift = myArray << 2;

この機能が必要な理由を知りたい場合は、次のようにします。

ボード上でプロジェクトを作成していますが、値の読み取りとメモリへの書き込みが頻繁に必要になります。cdf、sfr、または ddf (チップ定義ファイルと呼ばれる) には、特定のチップに関する情報が含まれています。そのファイルは次のようになります。

;     Name                            Zone      Address     Bytesize  Displaybase Bitrange
;     ----                            ----      -------     --------  ----------- --------

sfr = "SPI0_CONTROL"              , "Memory", 0x40001000,        4, base=16
sfr = "SPI0_CONTROL.SPH"          , "Memory", 0x40001000,        4, base=16,    bitRange=25-25
sfr = "SPI0_CONTROL.SPO"          , "Memory", 0x40001000,        4, base=16,    bitRange=24-24
sfr = "SPI0_CONTROL.TXRXDFCOUNT"  , "Memory", 0x40001000,        4, base=16,    bitRange=8-23
sfr = "SPI0_CONTROL.INT_TXUR"     , "Memory", 0x40001000,        4, base=16,    bitRange=7-7
sfr = "SPI0_CONTROL.INT_RXOVF"    , "Memory", 0x40001000,        4, base=16,    bitRange=6-6

多くの変数 (1 秒あたり 80 回の場合もあります) を読み取っているので、効率的なアルゴリズムが必要です。私のアプローチは、バイトサイズが 8 の場合、それらの 8 バイトから long を作成し、<<and>>演算子を使用して必要なものを取得するというものだと思います。バイトサイズが 4 の場合、int を作成して<<and>>演算子を使用しますが、16 バイトを読み取る必要がある場合はどうすればよいでしょうか? 私の質問は、カスタム構造体型に<<and>>演算子を実装する方法だったはずです。

4

3 に答える 3

5

System.CollectionsのBitArrayクラスが必要です。

于 2012-09-26T19:31:53.570 に答える
3

「ビットストリーム」を手伝ってくれるようです。ここにそのような概念の実装があります。見てください、おそらくそれはあなたのニーズに合っています。

于 2012-09-26T19:27:00.977 に答える
2

BigInteger.NET 4+のクラスはByte[]コンストラクターで a を取り、左シフト演算子と右シフト演算子を持ちます。

于 2012-09-26T19:36:40.403 に答える