2013-02-28 1 views
-1

나는 16 비트 부호없는 정수를 가지고 그 값은 다음과 같이이다 : 나는이 작업을 수행 한VB.NET의 Ushort 16 비트 정수에서 비트를 이동하는 방법은 무엇입니까?

1100000000000000 

을 :이에서

byte_val1 = 1000000000000001 

내가 바로이처럼이 이동하고 확인해야합니다

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이면 어떨까요? 처음에'byte_val1 And & H8000'과 같은'& H8000' 대신에 mask를 사용하고 싶을 수도 있습니다. 그런 다음 'byte_val1 = byte_val1 or mask'를 수행하십시오. – 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 
관련 문제