如何在一个整数中编码两个数字?

时间:2012-07-11 19:15:28

标签: c# javascript .net floating-point bitmask

我需要存储一系列值(例如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似乎不支持floatsingledoubledecimal上的位移运算符。 另外,我还需要最终在Javascript 中阅读这些值,因此无论使用哪个位编码浮点数在平台之间完全兼容,都会产生疑问。

最好的方法是什么?我考虑的一种方法就是使用整数,但是将所有内容除以1000.这样可以在两个数字中给出3个小数点精度,但我必须将整个事物存储为long存储超过65的任何东西。我不确定这是否是最好的方法。也许有一些我很容易丢失的东西。

5 个答案:

答案 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,然后再将其保存到数据库中。

请参阅下面的帖子以获取示例。

C#: Convert Byte array into a float

答案 3 :(得分:0)

您可以使用float to byte []转换为this question的答案。

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

答案 4 :(得分:0)

你要问的是数学和配对功能&#34;。

有很多配对功能,有Goedel's,Cantor's等等。

Godel p.f.对嵌套语言进行编码是不切实际的,但它对于没有那么多符号的普通语言来说非常好。