2

16 ビット ワードから 2 バイトを抽出し、2 バイトから 16 ビット ワードを作成しようとしています。これは私が試したものです(byte = unsigned char、word = unsigned short):

grpix ワードを 2 バイトに分割します。

word grpix; // Assume that the value has been initialized

byte grpixl = grpix & 0x00FF;
byte grpixh = grpix & 0xFF00;

2 バイトから grpix ワードを作成

byte grpixh; // Assume that the value has been initialized
byte grpixl; // Assume that the value has been initialized

word grpix = grpixh;
grpix <<= 8;
grpix += grpixl;

なんらかの理由で、私のコードは期待どおりに動作しません。単語の「分割」が間違っているのか、単語の「作成」が間違っているのか、あるいはその両方なのかわかりません...私にアドバイス?

4

5 に答える 5

5

言葉を分割するとき、あなたはシフトしていません。したがって、 の場合、期待どおりの結果が得られますが、最終的にgrpixはになります。言うべき0x1234grpixl0x34grpixh0x1200

byte grpixh = grpix >> 8;

もちろん、存在する可能性のあるエンディアンの問題も無視しています。htons()分割を試みる前に、単語を既知のエンディアンに ( のようなもので) 変換する必要があります (結合するときは逆の変換を行います)。

于 2013-02-21T01:15:35.553 に答える
4

あらゆる種類の操作を行うためのhttp://graphics.stanford.edu/~seander/bithacks.htmlをご覧ください。

right_byte = short_val & 0xFF;
left_byte = ( short_val >> 8 ) & 0xFF

short_val = (( left_byte & 0xFF ) << 8 ) | ( right_byte & 0xFF );

符号の問題がないことを確認するために、常に &0xFF マスクを実行します。

于 2013-02-21T01:21:18.833 に答える
0

上位バイトをマスクするときは、8 ビット下にシフトする必要もあります。そうしないと、下位 8 ビットがクリアされた 16 ビットの数値になってしまいます。

バイト grpixh = (grpix & 0xFF00) >> 8

また、plus-equals の代わりに or-equals を使用することで、構成をより効率的にすることができます。

grpix |= grpixh << 8

于 2013-02-21T01:16:25.873 に答える