我整理了一些扩展方法,用于将数值转换为二进制等价物。
但是我遇到了一个问题。
我们可以使用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 中获得期望值:
鉴于这些,我们如何可靠地将Single
值转换为二进制字符串?
-编辑-
我发现this statement:“没有精确的二进制表示形式0.1或0.01。” 几乎说明了一切。我决定放弃这一点,因为很明显,这种努力是徒劳的。
答案 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