c# - 如何将“单”转换为二进制?
问题描述
我正在整理一些扩展方法,用于将数值转换为其二进制等价物。
但我遇到了一个问题。
我们可以使用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 的精确二进制表示。” 这几乎说明了一切。我决定放弃这个,因为很明显这种努力是徒劳的。
解决方案
您提供的示例期望值只是数字的直接二进制表示,但是如果您想获得二进制数字的 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
推荐阅读
- ruby-on-rails - 如何在图像标签选项中编写 ruby 代码?
- zlib - IPP 修补了 ZLIB 缺失的符号
- sockets - 在 JavaFX 中的客户端服务器聊天应用程序中向所有人发送消息
- android - 在 python 脚本中通过 shell 命令打开一个 android 应用程序
- python - conda install sklearn_crfsuite 在 spyder 中不起作用
- bootstrap-table - wenzhixin 将记录追加到现有的引导表
- python - Matplotlib 图例中出现相同的符号
- postgresql - 如何连接到 OpenMapTiles Docker Postgres DB
- swift - 如何区分位于 2 个不同类中的表视图
- python - “user_id”列中的空值违反非空约束细节:失败行包含(34、30、空)