2013-02-28 3 views
-1

У меня есть 16 разрядное целое число без знака и его значения, как это:Как перенести биты в 16-битное целое число Ushort в VB.NET?

byte_val1 = 1000000000000001 

От этого мне нужно сдвиг вправо это и сделать это так:

1100000000000000 

Я сделал это:

byte_val1 = byte_val1 >> 1 

и получение 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 And & H8000'. Затем выполните 'byte_val1 = byte_val1 или маску'. – Neolisk

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