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

时间:2019-09-21 00:10:53

标签: c# vb.net binary type-conversion

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

但是我遇到了一个问题。

我们可以使用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>.

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

Enter image description here

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

-编辑-

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

1 个答案:

答案 0 :(得分:6)

您提供的示例期望值只是数字的直接二进制表示形式,但是,如果您想以二进制形式获取IEEE-754的数字表示形式,则可能不是最有效的方法,您可以使用{{1 }},如以下示例所示:

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-匹配IEEE-754 Floating Point Converter中的IEEE-754