c# - 如何在单个整数中编码两个数字?

标签 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 中读取这些值,因此无论 float 使用的位编码是否在平台之间完全兼容都是值得怀疑的。

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

最佳答案

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

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

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

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

您可以通过逆转过程让他们回来。

关于c# - 如何在单个整数中编码两个数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11439796/

相关文章:

c# - 空发布请求(.Net Core 3.1)

c# - c# WinForm 中字符串的长度

javascript - 带 Handlebars 的 #each 之外的变量

javascript - 这个数字是2的立方之和吗?

.net - 跨多个选项卡窗口共享 ASP.NET session 的方法

.net - 将 bindingRedirect 添加到 .Net 标准库

c# - 如何使用 JS 参数传递 ASP.NET 服务器端标签

javascript - 如何在jqgrid中加载新添加的数据

c# - "Use of unassigned local variable"错误的原因是什么?

c# - Unity麦克风无法正常工作