我有一个16位无符号整数,其值如下:
byte_val1 = 1000000000000001
由此我需要改变这一点并将其改为:
1100000000000000
我做到了:
byte_val1 = byte_val1 >> 1
并获得byte_val1 = 100000000000000
。
之后我做了
byte_val1 = byte_val1 Or &H80
但是我没有得到理想的结果......相反,我得到了100000010000000
。
那么我应该怎样做才能得到这个结果呢?
答案 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