VB.NET中的按位移位

时间:2012-12-21 10:11:45

标签: .net vb.net visual-studio-2012 bit-manipulation bit-shift

有两个字节存储的端口号,我想以整数形式返回。代码如下:

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&lt;&lt; 8 =&gt; 6400 + 145 =&gt; 6545

但这就是我得到的:25 + 145 =&gt; 145

2 个答案:

答案 0 :(得分:1)

您需要将(至少一个)操作数转换为移位操作为更大的数据类型。

来自<<

  

算术移位不是循环的,这意味着在结果的一端移出的位不会在另一端重新引入。在算术左移中,丢弃超出结果数据类型范围的位,并将右侧空出的位位置设置为零。

所以它需要像:

CInt(25) << 8 + 145

答案 1 :(得分:0)

我不确定你的代码是做什么的,不是它应该做的,而是基于你的例子:

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

(您也可以使用+代替Or,它不会改变一个东西,但使用按位或在这里感觉模糊得多更正确。)

更简单,使用the framework’s builtin methods

Dim result = CInt(BitConverter.ToInt16(req, 0))