如何将“单”转换为二进制?

Int*_*eXX -6 c# vb.net binary type-conversion

我整理了一些扩展方法,用于将数字值转换为它们的二进制等效项。

但是我遇到了一个问题。

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

Byte
Short
Integer
Long
Run Code Online (Sandbox Code Playgroud)

例如:

Dim iInteger As Integer
Dim sBinary As String

iInteger = Integer.MaxValue
sBinary = Convert.ToString(iInteger, 2)
Run Code Online (Sandbox Code Playgroud)

但是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
Run Code Online (Sandbox Code Playgroud)

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

Input: 1361294667
Result: Assert.AreEqual failed. Expected:<01010001001000111011010101001011>. Actual:<01010001001000111011010110000000>.
Run Code Online (Sandbox Code Playgroud)

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

在此处输入图片说明

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

- 编辑 -

我发现以下语句“没有精确的二进制表示形式0.1或0.01。” 这几乎说明了一切。我已经决定放弃这一点,因为很明显,这种努力是徒劳的。

Pet*_*erJ 6

您提供的示例期望值只是数字的直接二进制表示形式,但是,如果您想以二进制形式获取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
Run Code Online (Sandbox Code Playgroud)

该代码输出以下内容:

01010001001000111011010101001011 -符合您的示例

01001110101000100100011101101011-匹配来自IEEE-754浮点转换器的IEEE-754