gpt4 book ai didi

javascript - 在 JavaScript 中使用位移或数学创建通用数据溢出函数

转载 作者:行者123 更新时间:2023-11-28 01:31:16 24 4
gpt4 key购买 nike

用例

我正在学习函数式编程。在这个练习中,我想创建一个自然溢出的函数。举个例子,如果数据的范围是2-12,如果输入的值为12,加1,它就变成2。同样,如果你从2减去1,它就变成12。它应该需要指出的是,我想提高我的数学技能,因为过去 15 年我一直没有像数学家一样思考。如果这看起来相当微不足道,请原谅我。

实现

第一个实现如下:

var confineRange(value, min, max) {
var newValue = value;

while (newValue > max) {
newValue -= max;
}

while (newValue < min) {
newValue = max - (min - newValue);
}

return newValue;
}

Fiddle Here

这个实现有效,但是看到一个循环,意味着它可以改进。所以我尝试的第二个版本是这样的:

function confineRange(value, min, max) {
if (value > 0)
return (value % max - min)
if (value < 0)
return ((value + max) % max) - min
if (value == 0)
return max - min;
}

但是,这个版本看起来还可以进一步简化。

问题

  1. 如何将其封装在单个数学函数中?
  2. 是否可以使用位移位来创建此函数?如果是这样,怎么办?
  3. 是否有使用原生 JavaScript 函数的更优雅的解决方案?

最佳答案

首先,为了简单起见,我们只考虑正整数,假设满足参数的 max > min 关系,并且 value 为大于或等于min:

function confineRange(value, min, max) {
return ((value - min) % (max - min + 1)) + min;
}

范围的下限是 min,并且您希望限制在 max - min + 1 范围内。例如,使用 min = 2max = 12 示例,结果可以获得 11 个不同的值! (而不是像一开始看起来的那样 10 个)。

让我们用边缘情况来测试它:

confineRange(2, 2, 12);

这将执行 ((2 - 2) % (12 - 2 + 1)) + 2,结果为 2,很好。

confineRange(12, 2, 12);

这将执行 ((12 - 2) % (12 - 2 + 1)) + 2,结果为 12,也不错。请注意,12 - 2 等于 10,这是未修改地通过 % 11 的最大整数。现在让我们尝试 13:

confineRange(13, 2, 12);

现在,在部分计算之后,它看起来像 (11 % 11) + 2,这将按预期得到 2(也就是说,如果 13 达到 12 + 1,那么它将似乎正确地环绕到 2)。

所以基本的想法是这样的。

然而,由于 Javascript 可能会或可能不会处理负数,该函数可能会因数字低于 2 而失败,例如参见 this article 。我不知道该行为是否标准化,或者特定浏览器可能会也可能不会尝试修复它,所以最好假设这是未定义的。

现在的问题是你不可能在“%”运算符中输入负数,但是给定这个接口(interface)你只能用“%”(模)来解决问题。因此必须采用其他方法。

JavaScript 有一个 Math.floor() 函数,该函数始终向下舍入 ( check it here )。使用它可以消除负数问题,所以让我们用它构造我们自己的模:

function confineRange(value, min, max) {
t = value - min;
d = max - min + 1;
t = t - (Math.floor(t / d) * d);
return t + min;
}

取模发生在第三行 (t = t - (Math.floor(t/d) * d);) 行,这会独立计算 t % d的标志。此解决方案也适用于低于 2 的数字,因此,如果您在示例中提供 1 作为,您将得到 12。

对于你的第二个问题,这个问题可以通过位操作来解决,但前提是范围(你想要获得的不同值的数量)是 2 的幂。这种情况应用适当的 AND (&) 值上的掩码将完成这项工作。

关于javascript - 在 JavaScript 中使用位移或数学创建通用数据溢出函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22100467/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com