首页 > 解决方案 > 如何将“单”转换为二进制?

问题描述

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

但我遇到了一个问题。

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

Byte
Short
Integer
Long

例如:

Dim iInteger As Integer
Dim sBinary As String

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

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

我试过这段代码,改编自这个答案

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>.

我们可以从旧的 Windows 7 计算器的Programmer View中得到期望值:

在此处输入图像描述

鉴于这些,我们如何可靠地将Single值转换为二进制字符串?

- 编辑 -

我发现了这个说法“没有 0.1 或 0.01 的精确二进制表示。” 这几乎说明了一切。我决定放弃这个,因为很明显这种努力是徒劳的。

标签: c#vb.netbinarytype-conversion

解决方案


您提供的示例期望值只是数字的直接二进制表示,但是如果您想获得二进制数字的 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


推荐阅读