【发布时间】:2020-01-21 23:31:47
【问题描述】:
我正在整理一些扩展方法,用于将数值转换为其二进制等价物。
但我遇到了问题。
我们可以使用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 的精确二进制表示。” 这几乎说明了一切。我决定放弃这个,因为很明显这种努力是徒劳的。
【问题讨论】:
-
这是 BASIC 吗?无论是哪种语言,请用它标记您的帖子。
-
目前还不清楚“准确结果”应该是什么样子。 Single 是一个浮点数,它的二进制表示看起来像like this。注意专用于符号、尾数和指数的位。您可以将它们转储为由 32 个 1 和 0 组成的字符串,但该字符串的意义很小。代码 sn-p 只关注值,这很快就会变得不切实际。取1E38,取127位,其中只有前24位是非随机值。
-
所以表示值是不行的。在 vb.net 中很难做到这一点,您需要使用转换技巧从 Single 映射到 Integer。检查 this post 以获得 Caster 结构。
-
这个问题是discussed at meta
-
...twice.
标签: c# vb.net binary type-conversion