1

最初のバイト = 2 (dec)、2 番目のバイト = 1 (dec) とします。

したがって、最初のバイトは 257 (10 進数) を表します。したがって、2 番目のバイトは 1 (10 進数) を表します。

したがって、(合計) 16 ビット値は 258 (10 進数) です。

だから私がするなら:

  (byte1*256)+byte2

それはそれを行うための「適切な」方法ですか?それとももっと良い方法がありますか?

ありがとう、T.

4

3 に答える 3

4

最近のほとんどのオプティマイザーでは、それを行う「適切な」方法はありません。コードは、システムで最速のものに変換されます。

  • バイトを下位部分レジスタと上位部分レジスタに別々にロードする- 変換は行われず、バイトはそれぞれの場所に直接ロードされます。
  • 上位バイトをビットシフトし、下位バイトで OR-ing - のようなものbyte1<<8 | byte2
  • 上位バイトをビットシフトし、下位バイトを追加+- の代わりにa を使用することを除いて、上記と同じ|
  • システムで高速に動作するまったく異なるもの- 異なるアーキテクチャには、上記で説明されていないアーキテクチャ固有の最適化がある場合があります。

ソースコードでは、人間の読者に意図を明確にすることに集中する必要があり256ます。読者にとって最も意味のある乗算である場合は、乗算を使用します。ビット シフトの場合は、ビット シフトを使用します。コンパイラは、コードを可能な限り効率的にします。

于 2013-04-12T02:39:31.713 に答える
1

これはうまくいくはずです:

(byte1<<8) | byte2

しかし、私はここに落とし穴があるかもしれないと考えています。byte1データ型とbyte2データ型のサイズが 1 バイト (つまり 8 ビット) しかない場合、シフトはおそらく役に立ちません。

私はあなたがそれをした方法は完全にうまくいくはずだと思います。ただし、キックの場合、次のようなものもおそらく機能します。

int16 total = byte1;
total = (total<<8) | byte2
于 2013-04-12T02:38:15.663 に答える
0

ビットをシフトするシフト演算子を使用できます: (byte1 << 8) + byte2

左にシフトすることは、2 の累乗を掛けることと同じです。上の例では、

(2 << 8) は、(0b 10 0000 0000) である (0b 0000 0010 << 8) と同じです。

1 バイトは 8 ビットなので、8 シフトします。

于 2013-04-12T02:38:57.177 に答える