.net 如何在一个Integer中编码两个数字?

xzabzqsa  于 2023-03-04  发布在  .NET
关注(0)|答案(5)|浏览(426)

我需要存储一个范围内的值(如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的值。我不确定这是否是最好的方法。也许我遗漏了一些简单的东西。

vaj7vani

vaj7vani1#

一点数学就能解决这个问题。
首先确定你的精度,比如说2位数,你的数字范围到1000

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

前4位是数字1,然后是数字2。
你可以把他们带回来。

rqcrx0a6

rqcrx0a62#

只要你没有太多的小数位数,最简单的解决方案就是把每个数字乘以你想要的小数位数,然后把这两个数字都转换成整型,执行你的位操作,然后把结果存储在你的数据库中。
当你阅读它们的时候,你只需把数字分开,然后除以你之前用过的因子。

arknldoa

arknldoa3#

你所问的在数学中叫做配对函数。
有许多配对函数,其中有莫德尔的、康托的等。
Godel p.f.对嵌套语言的编码并不实用,但是对于没有那么多符号的普通语言来说,它是非常出色的。

lsmepo6l

lsmepo6l4#

在C#中,你有BitConverter,你可以在代码中将数据库中的浮点值转换成字节数组,然后对它做任何你需要做的事情,然后在保存到数据库之前将它转换回浮点值。
请看下面的帖子中的例子。
C#: Convert Byte array into a float

j2cgzkjk

j2cgzkjk5#

您可以使用float到byte[]的转换,将答案转换为this question
当你有一个字节数组时,你可以使用屏蔽技术。

相关问题