如何在VB.NET中移位Ushort 16位整数中的位?

时间:2013-02-28 05:52:19

标签: vb.net 16-bit uint

我有一个16位无符号整数,其值如下:

byte_val1 = 1000000000000001

由此我需要改变这一点并将其改为:

  1100000000000000

我做到了:

 byte_val1 = byte_val1 >> 1

并获得byte_val1 = 100000000000000

之后我做了

  byte_val1 = byte_val1 Or &H80

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

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

3 个答案:

答案 0 :(得分:0)

当您使用无符号数据类型时,符号位传播不会发生。使用带符号的整数表示所需的结果。

答案 1 :(得分:0)

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

byte_val1 = byte_val1 >> 1

byte_val1 = byte_val1 Or &H8000

它有效。

答案 2 :(得分:0)

您实际想要的是旋转这些位,而不是将它们移位:

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