2012-07-11 75 views
3

我需要存储的值的范围(如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似乎不支持位移操作符float,single,doubledecimal另外,我还需要在Javascript中最终读取这些值,因此无论使用哪种浮点编码,平台之间都可以完全兼容。

这样做的最好方法是什么?我正在考虑的一种方法是使用整数,但将所有数字除以1000.这会给我两个数字中的3个小数点精度,但我必须将整个数据存储为long以存储超过65个数字。米不知道这是否是最好的方法。也许有些东西很容易丢失。

+7

你错过的东西可能会改变你的数据库模式。 – 2012-07-11 19:17:38

+15

最好的方法是继续并将适当的列添加到数据库。上帝帮助下一个可以应付这种黑客的可怜家伙。 – Randy 2012-07-11 19:17:55

+0

@JamesMcLaughlin - 改变数据库模式是一件容易的事情。更改ORM代码和所有相关的数据结构就成了一个完整的噩梦。我花了几天时间,几乎没有,所以我正在寻找不同的方法。 – 2012-07-11 19:20:44

回答

3

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

首先解决您的精度,说2个数字,你的编号范围,直到1000

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

前4位是NUM1,然后你有NUM2。

您可以让他们恢复正常过程。

+0

我认为这也是我的做法,特别是因为它完全兼容Javascript。如果我决定走这条路。我不知道这个问题会如此有争议! – 2012-07-11 19:27:37

+3

这很难保持,想象一下如果你明天要搜索其中的某一列。有时候这种方法确实有意义,比如将多个变量包装在一起以节省传输字节。记录好黑客,所以下一个人不会傻眼。 – nunespascal 2012-07-11 19:31:27

0

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

查看下面的帖子的例子。

C#: Convert Byte array into a float

+0

切割位不知道他们如何将它缩短为16位将不起作用。浮游物有点奇特。 – Dykam 2012-07-11 19:23:59

3

只要你没有很多的十进制数的最简单的解决办法是用你想要的任何小数的金额,然后将两个数字到整数,执行你的位操作,然后保存每个数乘以结果在你的数据库中。

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

0

您可以使用浮动从答案的byte []转化为this question

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

+0

掩码仅适用于整数,而不适用于浮点数。 – Dykam 2012-07-11 19:26:18

+0

但掩码作品的字节数组!将float转换为byte [],然后进行屏蔽! – Batuu 2012-07-11 20:02:28

+0

但你打算如何恢复它并获得完全相同的浮点数? – Dykam 2012-07-12 14:21:59

0

你问的是在数学中称为“配对函数”。

有许多配对功能,amoung其中有戈德尔的,Cantor公司等

哥德尔P.F.对嵌套语言进行编码并不实用,但对于没有太多符号的普通语言而言,它是非常优秀的。