0

2 バイトで格納されたポート番号があり、整数として返したい。ここにコード:

Dim PORT As Integer
PORT = (req.Skip(req.Skip(4).Take(1).ToArray()(0) + 5).Take(1).ToArray()(0) << 8) + req.Skip(req.Skip(4).Take(1).ToArray()(0) + 6).Take(1).ToArray()(0)

しかし、これはうまくいきません。どうすれば修正できますか?

結果は次のようになります: 25 << 8 => 6400 + 145 => 6545

しかし、これは私が得たものです: 25 + 145 => 145

4

2 に答える 2

1

オペランド (少なくとも 1 つ) をシフト演算のより大きなデータ型に変換する必要があります。

から<<:

算術シフトは循環的ではありません。つまり、結果の一方の端からシフトされたビットはもう一方の端に再導入されません。算術左シフトでは、結果のデータ型の範囲を超えてシフトされたビットは破棄され、右側に空いたビット位置はゼロに設定されます。

したがって、次のようにする必要があります。

CInt(25) << 8 + 145
于 2012-12-21T10:52:33.203 に答える
0

あなたのコードが何をするのかわかりませんが、それが何をすべきかではなく、あなたの例に基づいています:

Dim result = CInt(req(0)) << 8 Or req(1)

(+の代わりに を使用することもできますOr。何も変わりませんが、ビットごとの or here を使用すると、漠然とより正確に感じられます。)

フレームワークの組み込みメソッドを使用すると、さらに簡単になります。

Dim result = CInt(BitConverter.ToInt16(req, 0))
于 2012-12-21T10:46:15.263 に答える