保留浮点数和在javascript中添加按位操作

时间:2012-05-06 21:33:26

标签: javascript floating-point bit-manipulation

我试图通过操作位来理解加,减,除和乘的方法。

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

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

这是我的问题。;)将(n1& n2)<<< 1&1做什么变换?这样做的目标是什么?与XOr一样,显然不需要对这些位执行任何其他操作,因为它们的十进制值是正确的,因为它们在sum var中。我不能想象一下&轮班操作。

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。

通过这样的方式: carry =(n1&amp; n2)&lt;&lt; 1; carry var将保存一串由n1和n2中匹配位置编译的二进制文件。因此,如果n1为4且n2为4,则它们都保持相同的值。因此,通过梳理两个和右移位到1指数将乘以4 x 2 = 8;所以携带现在等于8。

1。)var carry = 00001000 = 8                    &安培;                 00001000 = 8

2。)carry =现在保持单值00001000 = 8

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

3.)carry = carry&lt;&lt; 1,将所有位移到一个位置

4。)进位现在持有单个值00010000 = 16

我仍然无法找到有关使用浮点值的任何内容。如果有人有任何东西发布链接。

2 个答案:

答案 0 :(得分:2)

它不起作用,因为代码假定浮点数表示为整数,而它们不是。使用IEEE 754标准表示浮点数,该标准将数字分为三部分:符号位,一组表示指数的位,另一组表示数字介于1(含)和2(不包括)之间,尾数,数值计算为

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

偏差取决于浮点数的精度。因此,用于添加两个数字的算法假设这些位表示整数,而不是浮点数的情况。按位AND和按位OR等操作也不会给出整数世界中的结果。

一些例子,双精度,数字2.3表示为(十六进制)4002666666666666,而数字5.3表示为4015333333333333.或者这两个数字将给你4017777777777777,代表(大致)5.866666。 / p>

这种格式有一些很好的指示,我发现http://www.psc.edu/general/software/packages/ieee/ieee.phphttp://babbage.cs.qc.edu/IEEE-754/http://www.binaryconvert.com/convert_double.html的链接对于理解它非常有用。

现在,如果您仍想为这些数字实现按位添加,则可以。但你必须在其各部分中打破数字,然后将数字标准化为相同的指数(否则你将无法添加它们),在尾数上执行加法,最后将其归一化回IEEE754格式。但是,正如@LukeGT所说,你可能无法获得比正在运行的JS引擎更好的性能。并且一些JS实现甚至不支持对浮点数进行逐位运算,因此通常最终会发生的事情是它们首先将数字转换为整数,然后执行操作,这也会使结果不正确。

答案 1 :(得分:1)

浮点值具有复杂的位结构,使用位操作非常难以操作。因此,我怀疑你在计算它们时可以比Javascript引擎做得更好。浮点计算本身就很慢,所以如果你担心速度,你应该尽量避免它们。

尝试使用整数将十进制数表示为x位数。例如,如果您使用货币,则可以按整分美分存储货物,而不是按小数值计算货币。

希望有所帮助。