【问题标题】:How to shift a bits in a Ushort 16 bit integer in VB.NET?如何在 VB.NET 中移动 Ushort 16 位整数中的位?
【发布时间】:2013-02-28 05:52:18
【问题描述】:

我有一个 16 位无符号整数,它的值是这样的:

byte_val1 = 1000000000000001

从这里我需要把它右移并变成这样:

  1100000000000000

我已经这样做了:

 byte_val1 = byte_val1 >> 1

并获得byte_val1 = 100000000000000

后来我做了

  byte_val1 = byte_val1 Or &H80

但我没有得到想要的结果...相反,我得到了100000010000000

那么我应该怎么做才能得到这个结果呢?

【问题讨论】:

    标签: vb.net 16-bit uint


    【解决方案1】:

    当您使用无符号数据类型时,符号位传播不会发生。使用有符号整数来获得所需的结果。

    【讨论】:

      【解决方案2】:

      这次我猜对了。我这样做了:

      byte_val1 = byte_val1 >> 1
      
      byte_val1 = byte_val1 Or &H8000
      

      它奏效了。

      【讨论】:

      • 这将始终在左侧附加 1。如果你最右边的位是 0 怎么办?您可能想要使用掩码代替&H8000,它最初等于byte_val1 And &H8000。然后做byte_val1 = byte_val1 Or mask.
      【解决方案3】:

      您似乎真正想要的是旋转位,而不是移动它们:

      Module Module1
      
          Function RORUInt16(n As UInt16, r As Integer) As UInt16
              ' ensure number of places to shift is valid
              r = r And 15
              If r = 0 Then
                  ' nothing to do
                  Return n
              End If
      
              ' get bits from RHS
              Dim RHS = Convert.ToUInt16(n And ((2 << r) - 1))
              ' shift the original bits right (loses the RHS saved previously)
              Dim rb = Convert.ToUInt16(n >> r)
              ' put back the lost bits on the LHS
              rb = Convert.ToUInt16(rb Or (RHS << (16 - r)))
              Return rb
          End Function
      
          Sub Main()
      
              Dim b1 As UInt16 = Convert.ToUInt16("0000001000000111", 2)
      
              Console.WriteLine(Convert.ToString(b1, 2).PadLeft(16, "0"c))
              Console.WriteLine(Convert.ToString(RORUInt16(b1, 1), 2).PadLeft(16, "0"c))
              Console.ReadLine()
      
          End Sub
      
      End Module
      

      【讨论】:

        猜你喜欢
        • 2015-04-24
        • 2010-11-27
        • 2019-03-23
        • 2011-04-18
        • 1970-01-01
        • 1970-01-01
        • 2012-12-08
        • 1970-01-01
        • 2014-07-03
        相关资源
        最近更新 更多