[英]How do I turn a binary string into a float or double?
In this question, Bill The Lizard asks how to display the binary representation of a float or double . 在这个问题中,Bill The Lizard询问如何显示float或double的二进制表示 。
What I'd like to know is, given a binary string of the appropriate length, how could I perform the reverse operation (in C#)? 我想知道的是,给定一个适当长度的二进制字符串,我怎样才能执行反向操作(在C#中)? In other words, how do I turn a binary string into a float or double? 换句话说,如何将二进制字符串转换为float或double?
As a side note, are there any bit strings which would not result in a valid float or double? 作为旁注,是否有任何位串不会导致有效的浮点数或双倍?
EDIT: By binary string I mean a string of 0s and 1s. 编辑:二进制字符串我的意思是一个0和1的字符串。
So, my input will be a string like this: 所以,我的输入将是这样的字符串:
01010101010101010101010101010101
and my output should be a floating point number. 我的输出应该是一个浮点数。 (Or, if there were 64 bits in the string, a double.) (或者,如果字符串中有64位,则为double。)
double d1 = 1234.5678;
string ds = DoubleToBinaryString(d1);
double d2 = BinaryStringToDouble(ds);
float f1 = 654.321f;
string fs = SingleToBinaryString(f1);
float f2 = BinaryStringToSingle(fs);
// ...
public static string DoubleToBinaryString(double d)
{
return Convert.ToString(BitConverter.DoubleToInt64Bits(d), 2);
}
public static double BinaryStringToDouble(string s)
{
return BitConverter.Int64BitsToDouble(Convert.ToInt64(s, 2));
}
public static string SingleToBinaryString(float f)
{
byte[] b = BitConverter.GetBytes(f);
int i = BitConverter.ToInt32(b, 0);
return Convert.ToString(i, 2);
}
public static float BinaryStringToSingle(string s)
{
int i = Convert.ToInt32(s, 2);
byte[] b = BitConverter.GetBytes(i);
return BitConverter.ToSingle(b, 0);
}
string bstr = "01010101010101010101010101010101";
long v = 0;
for (int i = bstr.Length - 1; i >= 0; i--) v = (v << 1) + (bstr[i] - '0');
double d = BitConverter.ToDouble(BitConverter.GetBytes(v), 0);
// d = 1.41466386031414E-314
The same as in Marc's answer , you need BitConverter
again: 与Marc的答案相同,你需要再次使用BitConverter
:
Here's a solution that doesn't use BitConverter and isn't limited by the range of Int64 . 这是一个不使用BitConverter的解决方案,不受Int64范围的限制。
static double BinaryStringToDouble(string s)
{
if(string.IsNullOrEmpty(s))
throw new ArgumentNullException("s");
double sign = 1;
int index = 1;
if(s[0] == '-')
sign = -1;
else if(s[0] != '+')
index = 0;
double d = 0;
for(int i = index; i < s.Length; i++)
{
char c = s[i];
d *= 2;
if(c == '1')
d += 1;
else if(c != '0')
throw new FormatException();
}
return sign * d;
}
This version supports binary strings that represent values between to Double.MinValue and Double.MaxValue , or 1023 significant binary digits. 此版本支持二进制字符串,表示Double.MinValue和Double.MaxValue之间的值,或1023个有效二进制数字。 It overflows to Double.PositiveInfinity or Double.NegativeInfinity . 它溢出到Double.PositiveInfinity或Double.NegativeInfinity 。
@LukeH 's answer only supports binary strings that represent values between to Int64.MinValue and Int64.MaxValue , or 63 significant binary digits. @LukeH的答案仅支持表示Int64.MinValue和Int64.MaxValue之间的值的二进制字符串,或63个有效二进制数字。
Why you'd have a need for a binary string that is more than 63 digits in length is up for discussion. 为什么你需要一个长度超过63位的二进制字符串才能讨论。
If you don't want to allow a leading sign character, you can use this simpler version that only returns positive values. 如果您不想允许前导符号字符,则可以使用仅返回正值的更简单版本。
static double BinaryStringToDouble(string s)
{
if(string.IsNullOrEmpty(s))
throw new ArgumentNullException("s");
double d = 0;
foreach(var c in s)
{
d *= 2;
if(c == '1')
d += 1;
else if(c != '0')
throw new FormatException();
}
return d;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.