gpt4 book ai didi

javascript - 保留 float 并在javascript中添加按位运算

转载 作者:搜寻专家 更新时间:2023-11-01 04:19:28 25 4
gpt4 key购买 nike

我试图通过对位进行运算来理解加、减、除和乘的方法。

由于在事件发生后运行许多计算,因此有必要在我的 JavaScript 程序中进行一些优化。

通过使用下面的代码作为引用,我能够理解进位包含 &ing 值。然后通过执行 XOr 将 sum var 设置为每个 n1/n2 变量中不匹配的位。

这是我的问题。;) 将 (n1 & n2)<<1 移动 1 有什么作用?这样做的目的是什么?与 XOr 一样,很明显不需要对这些位执行任何其他操作,因为它们的十进制值和它们在 sum var 中一样是可以的。我无法在脑海中想象 & shift 操作正在完成什么。

function add(n1,n2)
{
var carry, sum;

// Find out which bits will result in a carry.
// Those bits will affect the bits directly to
// the left, so we shall shift one bit.
carry = (n1 & n2) << 1;

// In digital electronics, an XOR gate is also known
// as a quarter adder. Basically an addition is performed
// on each individual bit, and the carry is discarded.
//
// All I'm doing here is applying the same concept.
sum = n1 ^ n2;

// If any bits match in position, then perform the
// addition on the current sum and the results of
// the carry.
if (sum & carry)
{
return add(sum, carry);
}

// Return the sum.
else
{
return sum ^ carry;
};
};

上面的代码按预期工作,但它不返回浮点值。我必须将总数与浮点值一起返回。

有没有人有我可以使用上面的函数来帮助我处理浮点值?网站是否清楚地解释了我要寻找的内容?我试过搜索最后一天是这样,但找不到任何可以查看的内容。

我从这个资源中得到了上面的代码。 http://www.dreamincode.net/code/snippet3015.htm

提前致谢!

经过思考,左移到 1 的位置就是乘以 2。

通过这样的 &ing :carry = (n1 & n2) << 1; 进位变量将保存由 n1 和 n2 中的匹配位置编译而成的二进制字符串。因此,如果 n1 为 4 且 n2 为 4,则它们都具有相同的值。因此,通过将两者组合并右移到 1 索引将乘以 4 x 2 = 8;所以进位现在等于 8。

1.) var 进位 = 00001000 =8 & 00001000 =8

2.) carry = 现在持有单个值 00001000 =8

左移将乘以 8 x 2 =16,或 8 + 8 = 16

3.)carry = carry <<1 , 将所有位移动一个位置

4.) 进位现在拥有单个值 00010000 = 16

我仍然找不到任何关于处理浮点值的信息。如果有人有任何东西,请发布链接。

最佳答案

它不起作用,因为代码假定 float 表示为整数,而事实并非如此。 float 使用 IEEE 754 标准表示,该标准将数字分为三部分:符号 位、一组表示指数 的位,以及另一组表示1(含)和 2(不含)之间的数字,尾数,值的计算方式为

(sign is set ? 1 : -1) * (mantissa ^ (exponent - bias))

偏差取决于 float 的精度。因此,您用于将两个数字相加的算法假定这些位代表一个整数,而 float 则不是这种情况。按位与和按位或等运算也不会给出您在整数世界中所期望的结果。

一些例子,在 double 中,数字 2.3 表示为(十六进制)4002666666666666,而数字 5.3 表示为 4015333333333333。对这两个数字进行 OR 运算将得到 4017777777777777,它(大致)表示 5.866666。

关于这种格式有一些很好的建议,我在 http://www.psc.edu/general/software/packages/ieee/ieee.php 找到了链接, http://babbage.cs.qc.edu/IEEE-754/http://www.binaryconvert.com/convert_double.html非常适合理解它。

现在,如果您仍想为这些数字实现按位加法,您可以。但是您必须将数字分解成各个部分,然后将数字标准化为相同的指数(否则您将无法添加它们),对尾数执行加法,最后将其标准化回 IEEE754格式。但是,正如@LukeGT 所说,您可能不会获得比您正在运行的 JS 引擎更好的性能。而一些 JS 实现甚至不支持对 float 的按位运算,所以通常最终会发生的是他们先将数字转换为整数,然后再执行运算,这也会使你的结果不正确。

关于javascript - 保留 float 并在javascript中添加按位运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10474501/

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