代码之家  ›  专栏  ›  技术社区  ›  InteXX

如何将单数转换成二进制?

  •  0
  • InteXX  · 技术社区  · 5 年前

    我正在整理一些扩展方法,用于将数值转换为二进制等价值。

    我们可以用 Convert.ToString() 重载以将这些类型转换为二进制:

    Byte
    Short
    Integer
    Long
    

    例如:

    Dim iInteger As Integer
    Dim sBinary As String
    
    iInteger = Integer.MaxValue
    sBinary = Convert.ToString(iInteger, 2)
    

    但是没有超载 Single 接受基值的。单参数重载返回的是科学符号,而不是二进制值。

    我试过这个代码,改编自 this answer :

    Public Function ToBinary(Value As Single) As String
      Dim aBits As Integer()
    
      Dim _
        iLength,
        iIndex As Integer
    
      Select Case Value
        Case < BitLengths.BYTE : iLength = 7
        Case < BitLengths.WORD : iLength = 15
        Case < BitLengths.DWORD : iLength = 31
        Case < BitLengths.QWORD : iLength = 63
      End Select
    
      aBits = New Integer(iLength) {}
    
      For iIndex = 0 To iLength
        aBits(iLength - iIndex) = Value Mod 2
        Value \= 2
      Next
    
      ToBinary = String.Empty
    
      aBits.ForEach(Sub(Bit)
                      ToBinary &= Bit
                    End Sub)
    End Function
    

    但不幸的是,它返回的结果不准确:

    Input: 1361294667
    Result: Assert.AreEqual failed. Expected:<01010001001000111011010101001011>. Actual:<01010001001000111011010110000000>.
    

    我们可以从 程序员视图

    Enter image description here

    鉴于此,我们如何可靠地转换 单身 二进制字符串的值?

    --编辑--

    this statement : “0.1或0.01没有精确的二进制表示。”

    0 回复  |  直到 5 年前
        1
  •  6
  •   PeterJ    5 年前

    您提供的示例期望值只是数字的一个直接二进制表示,但是如果您想获得可以使用的二进制数字的IEEE-754表示,则可能不是最有效的方法 BitConverter.GetBytes

    Sub Main
        Dim i As Int32 = 1361294667
        Console.WriteLine(ObjectAsBinary(i))
        Dim s As Single = 1361294667
        Console.WriteLine(ObjectAsBinary(s))
    End Sub
    
    Private Function ObjectAsBinary(o As Object) As String
        Dim bytes = BitConverter.GetBytes(o)
        If BitConverter.IsLittleEndian Then
            Array.Reverse(bytes)
        End If
        Dim result As String = ""
        For Each b In bytes
            result &= Convert.ToString(b, 2).PadLeft(8, "0")
        Next
        Return result
    End Function
    

    该代码输出以下内容:

    01010001001000111011010101001011 -符合你的例子

    01001110101000100100011101101011 -符合IEEE-754 IEEE-754 Floating Point Converter