【问题标题】:Bitwise shift in VB.NETVB.NET 中的按位移位
【发布时间】:2012-12-08 21:58:11
【问题描述】:

有一个端口号存储在两个字节中,我想将它作为整数返回。代码如下:

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 6400 + 145 => 6545

但这就是我得到的:25 + 145 => 145

【问题讨论】:

  • 不起作用:返回错误的结果?抛出异常?导致宇宙不复存在?
  • @Damien_The_Unbeliever 结果错误。
  • 你得到什么结果&你想要什么结果?
  • 除了 Phil 的要求之外,我们还可以使用数组(或任何 req 本身)的示例。
  • 更新了一个例子。

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


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

    来自&lt;&lt;

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

    所以它需要是这样的:

    CInt(25) << 8 + 145
    

    【讨论】:

      猜你喜欢
      • 2010-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多