0

私はバイト配列を持っています:

byte data[2]

最初の 7 ビットと 2 番目の 3 ビットを維持したいと考えています。私はこれをします:

unsigned int the=((data[0]<<8 | data[1])<<1)>>6;

これがうまくいかない理由を教えてください。別の行で実行すると、正常に動作します。

4

2 に答える 2

2

最初の下位 7 ビットと 2 番目の最上位 3 ビットを保持します。

保持される 10 ビットがunsigned int値の LSB であり、連続している必要があり、3 ビットが結果の LSB であると仮定すると、次のようになります。

unsigned int value = ((data[0] & 0x7F) << 3) | ((data[1] & 0xE0) >> 5);

すべてのマスキング オペランドが必要なわけではありません。byteそれは(おそらく、または が符号なしのマシンではunsigned charプレーン)の定義に部分的に依存しますが、書き込まれたものはどこでも機能するはずです (16 ビット、32 ビット、または 64 ビット; 符号付きまたは符号なし 8 ビット (または 16 -ビット、または 32 ビット、または 64 ビット) の値)。charcharintbyte

あなたのコードはdata[0]どの時点からも上位ビットを削除しません — おそらく、 がunsigned int16 ビット値のプラットフォームを使用している場合を除きますが、その場合は、最近ではコメントを正当化するのに十分珍しいことです。

于 2013-05-23T16:31:56.927 に答える
2
  • これがうまくいかない理由を教えてください。

ヒント:

2 バイトがあり、最初の下位 7 ビットと 2 番目の最上位 3 ビットを保持したい場合:

data[0]: -xxxxxxx    data[1]: xxx-----

- は削除するビットを表し、x は保持するビットを表します。

この後

(data[0]<<8 | data[1])<<1

あなたが持っている:

the: 00000000 0000000- xxxxxxxx xx-----0

次に、作成する>>6と結果は次のようになります。

the: 00000000 00000000 00000-xx xxxxxxxx

ほら、データ[0]から上位ビットを削除していません。

于 2013-05-23T18:22:34.160 に答える