1

私は、必要以上に難しい解決策を思いついたと思うよこしまな小さな問題を抱えています。

問題は、2 バイトあることです。最初のバイトの最初の 2 ビットは削除されます (値がリトル エンディアンであるため、これらのビットは実質的に 16 ビット値の中央にあります)。次に、削除されたビットの代わりに、2 番目のバイトの最下位 2 ビットを最初のバイトの最上位ビット位置に移動します。

私の解決策は次のとおりです。

byte firstByte = (byte)stream.ReadByte(); // 01000100
byte secondByte = (byte)stream.ReadByte(); // 00010010
// the first and second byte equal the decimal 4676 in this little endian example

byte remainderOfFirstByte = (byte)(firstByte & 63); // 01000100 & 00111111 = 00000100

byte transferredBits = (byte)(secondByte  << 6); // 00010010 << 6 = 10000000

byte remainderOfSecondByte = (byte)(secondByte >> 2); // 00010010 >> 2 = 00000100

byte newFirstByte = (byte)(transferredBits | remainderOfFirstByte); // 10000000 | 00000100 = 10000100
int result = BitConverter.ToInt32(new byte[]{newFirstByte, remainderOfSecondByte, 0, 0}, 0); //10000100 00010000 (the result is decimal 1156)

これを達成するためのより簡単な方法*はありますか? *冗長ではありませんが、おそらく組み込みの関数またはトリックがありませんか? (同じ行で & と << の両方を実行することを除いて)

4

1 に答える 1

1

とにかくシフトが捨てるビットをマスクする必要はありません。これらのビットを手動で転送する必要はありません。したがって、次のようになります: (未テスト)

int result = (secondByte << 6) | (firstByte & 0x3F);
于 2012-09-04T08:18:08.203 に答える