2013-02-28 42 views
-1

我有一個16位無符號整數,它的值是這樣的:如何在VB.NET中移位Ushort 16位整數中的位?

byte_val1 = 1000000000000001 

從這個我需要右移這一點,使它像這樣:

1100000000000000 

我已經做到了這一點:

byte_val1 = byte_val1 >> 1 

and getting byte_val1 = 100000000000000

之後,我做了

byte_val1 = byte_val1 Or &H80 

,但我沒有得到期望的結果......相反,我得到了100000010000000

那麼我應該怎麼做才能得到這個結果呢?

回答

0

這次我明白了。我這樣做:

byte_val1 = byte_val1 >> 1 

byte_val1 = byte_val1 Or &H8000 

和它的工作。

+0

這將始終追加1到左側。如果你的最右邊的位是0呢?您可能想使用掩碼而不是'&H8000',它最初等於'byte_val1和&H8000'。然後執行'byte_val1 = byte_val1或者mask'。 – Neolisk 2013-07-27 19:27:31

0

由於您使用的是無符號數據類型,因此不會發生符號位傳播。使用有符號的整數作爲所需的結果。

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