[英]Convert 32-bit signed integer to 64-bit integer while preserving the exact bits
我有一個存儲在VB.Net類型Integer(即Int32)中的32位值。我只對位感興趣,而不是對數值感興趣。 有時,第32位是一個被解釋為負數的位。 我的目標是反轉實際位。 我的原始數據從右到左(LSB最右邊)編碼為位,並以從左到右(MSB最左邊)的方式讀回。我正在改編其他人的代碼和設計。 我曾經想過可能是暫時轉換為較長時間,但是我不知道該怎么做並正確保留第32位。
Public Shared Function ReverseBits32(ByVal n As Integer) As Integer
Dim result As Integer = 0
For i As Integer = 0 To 32 - 1
result = result * 2 + n Mod 2
n = n >> 1 'n Or 2
Next
Return result
End Function
如果您有一種方法可以反轉一個字節的位,則可以將其四次應用於整數的字節。 一項小研究發現Bit Twiddling Hacks 。
Module Module1
Sub ShowBits(a As Integer)
Dim aa = BitConverter.GetBytes(a)
Console.WriteLine(String.Join(" ", aa.Select(Function(b) Convert.ToString(b, 2).PadLeft(8, "0"c))))
End Sub
Function ReverseBits(b As Byte) As Byte
' From https://graphics.stanford.edu/~seander/bithacks.html#ReverseByteWith32Bits
Dim c = CULng(b)
Return CByte((((c * &H802UL And &H22110UL) Or (c * &H8020UL And &H88440UL)) * &H10101UL >> 16) And &HFFUL)
End Function
Function ReverseBits(a As Integer) As Integer
Dim bb = BitConverter.GetBytes(a)
Dim cc(3) As Byte
For i = 0 To 3
cc(3 - i) = ReverseBits(bb(i))
Next
Return BitConverter.ToInt32(cc, 0)
End Function
Sub Main()
Dim y = -762334566
ShowBits(y)
y = ReverseBits(y)
ShowBits(y)
Console.ReadLine()
End Sub
End Module
測試值輸出:
10011010 10110010 10001111 11010010
01001011 11110001 01001101 01011001
我之所以使用“無64位”方法,是因為它是為忽略算術溢出的語言編寫的-使用64位操作的方法依賴於此,但它不是VB.NET的默認設置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.