ビットの範囲を取得できる方法を探しています。たとえば、バイナリデータがある場合
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 0
1 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>>
演算子を実装する方法だったはずです。