将32位带符号整数转换为64位整数,同时保留确切的位

时间:2019-03-25 14:48:10

标签: vb.net types type-conversion

我有一个32位值,该值存储在VB.Net类型Integer(即Int32)中。我只对位感兴趣,而对数值不感兴趣。有时,第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

1 个答案:

答案 0 :(得分:1)

如果您有一种方法可以反转字节的位,则可以将其四次应用于整数的字节。少量研究发现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的默认设置。