Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 有效地将浮点值和双精度值转换为字节,以保持值之间的比较关系_Algorithm - Fatal编程技术网

Algorithm 有效地将浮点值和双精度值转换为字节,以保持值之间的比较关系

Algorithm 有效地将浮点值和双精度值转换为字节,以保持值之间的比较关系,algorithm,Algorithm,我需要一种方法来有效地将任何float或double值转换为字节数组,以便保留与任何其他值的比较关系 示例:V1和V2被转换为数组A1和A2。如果A1[0]A2[1],则V1必须大于V2。等等如果所有字节都相同,则值V1和V2必须相等 对于四字节整数I,满足上述条件的数组将是[U>24、(U>16)&255、(U>8)&255、U&255],其中U是uint正值V-int.MinValue 因为double存储为8字节,所以我希望接近8字节 你认为这样的事情能实现吗?谢谢 首选C#解决方案。大多

我需要一种方法来有效地将任何floatdouble值转换为字节数组,以便保留与任何其他值的比较关系

示例:V1V2被转换为数组A1A2。如果A1[0]A2[1],则V1必须大于V2。等等如果所有字节都相同,则值V1V2必须相等

对于四字节整数I,满足上述条件的数组将是[U>24、(U>16)&255、(U>8)&255、U&255],其中U是uint正值V-int.MinValue

因为double存储为8字节,所以我希望接近8字节

你认为这样的事情能实现吗?谢谢


首选C#解决方案。

大多数语言使用的双精度和浮点的标准表示法已经非常接近于支持此要求

在C#中,可以使用或直接作为整数获取double或float的底层位

为了正确进行比较,您只需调整负数的处理方式:

long bits = BitConverter.DoubleToInt64Bits( theDouble );
if (bits < 0L) {
    bits ^= Int64.MaxValue;
}
请注意,如果要生成字节数组,可能需要将其转换为无符号整数。如果要保留顺序,或只需按以下方式操作,则需要翻转符号位:

long bits = BitConverter.DoubleToInt64Bits( theDouble );
ulong arraybits;
if (bits >= 0L) {
    arraybits = (1UL<<63) + (ulong)bits;
} else {
    arraybits = (ulong)~bits;
}
长位=位转换器。双字节到64位(双字节);
乌龙阵列;
如果(位>=0L){

arraybits=(1使用哪种语言?C#中可用的技术可能不同于JavaScript中可用的技术。我需要一个通用的东西。C#首选。(我想删除JS标记,但我觉得不适合我这么做。)请不要滥发标签。如果你想要一个非特定于某一语言的算法,请使用
语言不可知的
标签。如果你想要C#代码,请使用
C#
标签。如果你想要JavaScript,请使用
JavaScript
标签。当你问一个与计算机相关的问题时,你会得到一个语法错误……天哪!这正是我想要的正在等待。谢谢,Matt!我很快会测试它并将其标记为答案。它的工作原理与广告一样,我将其标记为正确答案。请注意:SingleToInt32位不适用于.NET Framework,因此它也不适用于.NET标准2.0库。
long bits = BitConverter.DoubleToInt64Bits( theDouble );
ulong arraybits;
if (bits >= 0L) {
    arraybits = (1UL<<63) + (ulong)bits;
} else {
    arraybits = (ulong)~bits;
}