c# - 转换数字范围
问题描述
我需要将一个介于 0 和 65535 之间的数字转换为另一个介于 -800 和 240 之间的数字
所以如果 oldNumber = 0,那么 newNumber = -800
public static int ConvertA(int oldNumber)
{
}
newNumber = ConvertA(oldNumber);
反之亦然,所以如果它是 -800 到 240 则将其转换为 0 到 65535
public static int ConvertB(int oldNumber)
{
}
newNumber = ConvertB(oldNumber);
解决方案
你有两个整数区间A = [0, 65535]
,B = [-800, 240]
并且你想要一个映射f: A -> B
。
你似乎已经说过你也想要约束:
f(0) == 240
f has a inverse transform g
.
由于A
(65536) 中的元素个数大于B
(1041) 中的元素数,根据鸽子洞原理f
,不可能injective
(必须有x
, y
inA
这样f(x) == f(y)
)。
结果,f
不能进行逆变换g
。这意味着约束无法得出解决方案。也就是说,您的问题没有解决方案。
另外,请注意,您的变换不能是linear
. 如果它是线性的,则需要满足f(a*x) == a*f(x)
每个a
and x
,这不可能是真的,因为如果我们选择x == 0
and a == 2
,我们就有f(2*0) == f(0) == 240 == 2 * f(0) == 480
,这显然是荒谬的。
线性要求f(0) == 0
。
但是,让我们变得灵活并改变你的约束......
因此,让我们假设我们不需要逆矩阵并且 f 不需要是线性的。也许是一个映射,例如
f(x) := max((-x) + 240, -800)
满足您的需求。
在这种情况下:
f(0) == max(240, -800) == 240
,满足第一个约束- 我们可以定义
g: B -> A
asg(x) := (-x) + 240
,它满足g(240) == 0
并且是这样的,当约束到of时f(g(x)) == max((x - 240) + 240, -800) == max(x, -800) == x
,含义f
是相反的。g
Range
g
最重要的是,以下解决方案可能是合适的:
f(x) := max((-x) + 240, -800)
g(x) := (-x) + 240
只是不要期望线性和/或逆变换。
使用这个假设,你有它:
public static int ConvertA(int oldNumber)
{
if(oldNumber < 0 || oldNumber > 65535)
throw new ArgumentOutOfRangeException();
return Math.Max((-oldNumber) + 240, -800);
}
int newNumber = ConvertA(oldNumber);
public static int ConvertB(int oldNumber)
{
if(oldNumber < -800 || oldNumber > 240)
throw new ArgumentOutOfRangeException();
return -oldNumber + 240;
}
int newNumber = ConvertB(oldNumber);
请记住,正如在乞讨中所讨论的那样,那ConvertB(ConvertA(65535))
不是65535
,因为ConvertB
不是ConvertA
推荐阅读
- json - 无法在 https 服务器中下载 json 数据,在本地也可以正常工作
- java - JaxB:将 xsi:type 和 xmlns:q1 设置为请求对象
- python - 每年在python中生成日期范围?
- angular - IE 11 在尝试调用 HTTP 获取请求时给出“无效的调用对象”
- c# - 带有编码字符串的 URI 对象行为
- java - 如何限制用户在android中手动编辑日历
- javascript - useState 与 React 中的异步操作冲突
- ansible - 配置文件中的 Ansible 可选变量
- pyspark - 从 pyspark 数据框中删除具有相同值但在不同列中的重复行
- c# - 使用实体框架将前一天的记录复制到同一个表中