Я собираю небольшую горстку методов расширения для преобразования числовых значений в их двоичные эквиваленты.
Но я сталкиваюсь с проблемой.
Мы можем использовать *Перегрузка 1005 * для преобразования этих типов в двоичные:
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>.
Мы можем получить ожидаемое значение из Programmer View старого калькулятора Windows 7:
Учитывая это, как мы можем надежно преобразовать значение Single
в двоичную строку?
- EDIT -
Я нашел это утверждение : "Нет точного двоичного представления 0,1 или 0,01." Это в значительной степени говорит само за себя.Я решил отказаться от этого, так как стало ясно, что это бесполезное занятие.