我需要存储一系列值(例如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
,double
或decimal
上的位移运算符。 另外,我还需要最终在Javascript 中阅读这些值,因此无论使用哪个位编码浮点数在平台之间完全兼容,都会产生疑问。
最好的方法是什么?我考虑的一种方法就是使用整数,但是将所有内容除以1000.这样可以在两个数字中给出3个小数点精度,但我必须将整个事物存储为long
存储超过65的任何东西。我不确定这是否是最好的方法。也许有一些我很容易丢失的东西。
答案 0 :(得分:5)
一点点数学可以解决这个问题。
首先修复你的精确度,比方说2位数,你的数字范围直到1000
both = Math.Round(num1, 2) * 10000 + Math.Round(num2, 2);
前4位数字用于num1,然后你有num2。
你可以让他们扭转这个过程。
答案 1 :(得分:3)
只要您没有大量的十进制数字,最简单的解决方案就是将每个数字乘以您想要的任何小数位数,然后将这两个数字转换为整数,执行位操作,然后将结果存储在数据库中。
阅读它们时,您只需将数字拆分,然后除以之前使用的因子。
答案 2 :(得分:0)
在C#中你有BitConverter。您可以将DB中的Float值转换为代码中的字节数组,然后根据需要执行任何操作,然后将其转换回Float,然后再将其保存到数据库中。
请参阅下面的帖子以获取示例。
答案 3 :(得分:0)
您可以使用float to byte []转换为this question的答案。
当你有一个字节数组时,你可以使用你的掩蔽技术。
答案 4 :(得分:0)
你要问的是数学和配对功能&#34;。
有很多配对功能,有Goedel's,Cantor's等等。
Godel p.f.对嵌套语言进行编码是不切实际的,但它对于没有那么多符号的普通语言来说非常好。