Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 将32位带符号整数转换为64位整数,同时保留精确位_Vb.net_Types_Type Conversion - Fatal编程技术网

Vb.net 将32位带符号整数转换为64位整数,同时保留精确位

Vb.net 将32位带符号整数转换为64位整数,同时保留精确位,vb.net,types,type-conversion,Vb.net,Types,Type Conversion,我有一个存储在VB.Net类型整数(即Int32)中的32位值。我只对位感兴趣,而不是数值。有时第32位被解释为负数。我的目标是逆转实际的比特数。我的原始数据从右到左(LSB最右边)编码为位,并从左到右(MSB最左边)读回。我正在修改其他人的代码和设计。我的一个想法是可能暂时转换为long,但我不知道如何正确地保存第32位 Public Shared Function ReverseBits32(ByVal n As Integer) As Integer Dim result As I

我有一个存储在VB.Net类型整数(即Int32)中的32位值。我只对位感兴趣,而不是数值。有时第32位被解释为负数。我的目标是逆转实际的比特数。我的原始数据从右到左(LSB最右边)编码为位,并从左到右(MSB最左边)读回。我正在修改其他人的代码和设计。我的一个想法是可能暂时转换为long,但我不知道如何正确地保存第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

如果有一种方法可以反转字节的位,那么可以将其应用于整数的字节四次。一些研究发现

测试值的输出:


我使用“no 64 bit”方法是因为它是为忽略算术溢出的语言编写的-使用64 bit操作的方法依赖于此,但它不是VB.NET的默认值。

如果您只对位感兴趣,为什么要使用带符号整数?我从一个示例应用程序开始,该应用程序最初使用8位值,但使用32位整数实现。这是有道理的,因为这将有更高的性能。我的使用需要32位的值。如果我在此时尝试转换数据类型,将大大延迟我的项目。我会编辑这个问题,以便更准确地解释我的要求。它不允许我编辑。所以我需要一个函数来完全反转32位有符号整数中的位。当第32位是1时,我被它绊倒了,因此它是一个负数。所以你实际上需要的只是一种方法,在32位整数中反转位,这就是你遇到的问题?你根本不需要转换到64位,只要有其他方法可以反转32位?是的,很抱歉我没有更清楚。这将花费我一些时间来解决,但我假设“CByte(((c*&H802UL和&H22110UL)或(c*&H8020UL和&H88440UL))*&H10101UL>>16)和&HFFUL)正在处理符号位?这看起来很有希望。A未签名
BitConverter.GetBytes
获取原始字节而不进行任何解释。所以符号位不在其中:)
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