簡體   English   中英

將32位帶符號整數轉換為64位整數,同時保留確切的位

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM