-1

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

byte_val1 = 1000000000000001

从这里我需要右移它并使它像这样:

  1100000000000000

我已经这样做了:

 byte_val1 = byte_val1 >> 1

并得到byte_val1 = 100000000000000.

之后我做了

  byte_val1 = byte_val1 Or &H80

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

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

4

3 回答 3

0

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

于 2013-02-28T06:03:55.707 回答
0

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

byte_val1 = byte_val1 >> 1

byte_val1 = byte_val1 Or &H8000

它奏效了。

于 2013-02-28T06:07:02.467 回答
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
于 2013-07-27T18:24:39.693 回答