5

我需要存储一系列值(如 25-50 或 100-200),但是为了避免大量的数据库重新设计和其他工作,我想使用一个Int32来存储这两个数字。我意识到每个数字只有 16 位,但这很好。

因此,使用两个整数值非常容易。我可以做类似的事情:

int mask = 50; //Right bits will have 50
mask |= (25 << 16); //Left bits will have 25

Console.WriteLine("Mask is: {0}", mask);
Console.WriteLine("Left is: {0}", (mask >> 16));
Console.WriteLine("Right is: {0}", (mask & 0xFFFF));

现在,我有右 16 位存储值 50,左 16 位存储值 25。

那么问题是什么?

现在,我想使用相同的技术,但我想存储两个非整数。例如,1.5 和 1.75,或 2.00 和 2.25。.NET 似乎不支持floatsingle或. 另外,我最终还需要在 Javascript 中读取这些值,因此怀疑使用的任何位编码浮点是否在平台之间完全兼容。doubledecimal

最好的方法是什么?我正在考虑的一种方法是只使用整数,但将所有内容除以 1000。这将使我在两个数字中都有 3 个小数点精度,尽管我必须将整个内容存储为 along以存储超过 65 的任何内容。我是不确定这是否是最好的方法。也许我缺少一些简单的东西。

4

5 回答 5

6

一点数学就可以解决这个问题。

首先确定你的精度,比如 2 位数字,你的数字范围直到 1000

both = Math.Round(num1, 2) * 10000 + Math.Round(num2, 2);

前 4 位数字用于 num1,然后您有 num2。

你可以让他们回来扭转这个过程。

于 2012-07-11T19:22:21.080 回答
3

只要您没有很多十进制数字,最简单的解决方案就是将每个数字乘以您想要的任意数量的小数,然后将两个数字转换为整数,执行您的位运算,然后将结果存储在您的数据库中。

阅读它们时,您只需将数字拆分,然后将其除以您之前使用的因子。

于 2012-07-11T19:22:16.370 回答
1

您所问的在数学中称为“配对函数”。

配对函数有很多,其中有 Goedel's、Cantor's 等。

Godel pf 对嵌套语言进行编码并不实用,但对于符号不多的普通语言来说却是极好的。

于 2015-08-09T16:43:13.873 回答
0

在 C# 中,您有 BitConverter。您可以将数据库中的浮点值转换为代码中的字节数组,然后对它进行任何您需要的操作,然后将其转换回浮点值,然后再将其保存到数据库中。

有关示例,请参见下面的帖子。

C#:将字节数组转换为浮点数

于 2012-07-11T19:22:07.430 回答
0

您可以从这个问题的答案中使用浮点数到字节[] 的转换。

当你有一个字节数组时,你可以使用你的屏蔽技术。

于 2012-07-11T19:22:46.640 回答