Vin*_*ows 5 javascript floating-point bit-manipulation
我试图通过操作位来理解加,减,除和乘的方法.
由于在事件发生后运行了许多计算,因此有必要在我的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;
};
};
Run Code Online (Sandbox Code Playgroud)
上面的代码按预期工作,但它不返回浮点值.我必须将总数与浮点值一起返回.
有没有人有一个我可以用上面的功能,这将有助于我浮点值?网站是否清楚地解释了我在寻找什么?我试过搜索最后一天是这样,找不到任何东西去看看.
我从这个资源获得了上面的代码. http://www.dreamincode.net/code/snippet3015.htm
在考虑它左移到1位置后乘以2.
通过这样:carry =(n1&n2)<< 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 << 1,将所有位移到一个位置
4.)进位现在持有单个值00010000 = 16
我仍然无法找到任何有关浮点值的工作.如果有人有任何事情发布链接.
它不起作用,因为代码假设浮点数表示为整数,但事实并非如此。浮点数使用 IEEE 754 标准表示,该标准将数字分为三部分:一个符号位、一组表示指数的位、另一组表示 1(含)和 2(不包括)之间的数字、尾数,该值计算为
(sign is set ? 1 : -1) * (mantissa ^ (exponent - bias))
Run Code Online (Sandbox Code Playgroud)
其中偏差取决于浮点数的精度。因此,用于添加两个数字的算法假设这些位代表一个整数,而浮点数则不然。按位与和按位或等运算也不会给出您在整数世界中期望的结果。
一些示例,在双精度中,数字 2.3 表示为(十六进制)4002666666666666,而数字 5.3 表示为 4015333333333333。对这两个数字进行或运算将得到 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 实现甚至不支持浮点数的按位运算,所以通常最终发生的情况是它们首先将数字转换为整数,然后执行运算,这也会使你的结果不正确。