私はバイト配列を持っています:
byte data[2]
最初の 7 ビットと 2 番目の 3 ビットを維持したいと考えています。私はこれをします:
unsigned int the=((data[0]<<8 | data[1])<<1)>>6;
これがうまくいかない理由を教えてください。別の行で実行すると、正常に動作します。
私はバイト配列を持っています:
byte data[2]
最初の 7 ビットと 2 番目の 3 ビットを維持したいと考えています。私はこれをします:
unsigned int the=((data[0]<<8 | data[1])<<1)>>6;
これがうまくいかない理由を教えてください。別の行で実行すると、正常に動作します。
最初の下位 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 ビット) の値)。char
char
int
byte
あなたのコードはdata[0]
どの時点からも上位ビットを削除しません — おそらく、 がunsigned int
16 ビット値のプラットフォームを使用している場合を除きますが、その場合は、最近ではコメントを正当化するのに十分珍しいことです。
ヒント:
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]から上位ビットを削除していません。