繁体   English   中英

在JavaScript中乘法的更快方法?

[英]Faster way to multiply in javascript?

我正在寻找在JavaScript中快速乘法的方法,我发现了这一点

https://medium.com/@p_arithmetic/4-more-javascript-hacks-to-make-your-javascript-faster-1f5fd88a219e#.306ophng2

里面有这段文字

Instead of multiplying, use the bit shift operation. it looks a little more complex, but once you get the hang of it, it’s pretty simple. The formula to multiply x * y is simply x << (y-1)

As a bonus, everyone else will think you’re really smart!

// multiply by 1
[1,2,3,4].forEach(function(n){ return n<<0; }) // 1,2,3,4
// multiply by 2
[1,2,3,4].forEach(function(n){ return n<<1; }) // 2,4,6,8
// multiply by 3
[1,2,3,4].forEach(function(n){ return n<<2; }) // 3,6,9,12
// etc

但是,这似乎不适用于我。 有人知道怎么了吗?

谢谢

忽略该文章。 它的目的是幽默-它所提供的建议是故意的,是错误的。

  1. 乘法不涉及“昂贵的对数查询表和极其幸运的猜测”与“每秒数十次猜测”。 这是高度优化的硬件操作,任何现代CPU 每秒都可以执行数亿个 (或更多!)这些操作。

  2. 按位运算并不比Javascript中的乘法快。 实际上,它们要慢得多-默认情况下,数字通常默认存储为双精度浮点,因此执行按位运算要求将其转换为整数,然后转换为整数。

  3. 移位并不等于本文所暗示的乘法。 虽然左移0和1等于乘以1和2,但模式继续<<2<<3等于乘以4和8 ,而不是3和4。

  4. Array.forEach不返回值。 此处使用的适当功能是Array.map

本文中描述的其他“ Java hacks”甚至更糟。 我不会打扰细节。

顺便说一句,如果您想知道为什么它不适合您,您将要使用map而不是forEach因为forEach忽略返回值。

因此改为:

// multiply by 1
[1,2,3,4].map(function(n){ return n<<0; }) // 1,2,3,4
// multiply by 2
[1,2,3,4].map(function(n){ return n<<1; }) // 2,4,6,8
// multiply by 4
[1,2,3,4].map(function(n){ return n<<2; }) // 4,8,12,16
// multiply by 8
[1,2,3,4].map(function(n){ return n<<3; })  // 8, 16, 24, 32

正如其他人提到的那样-请勿将其用于乘法。 只是为了清楚了解forEach vs map ...

位移不等于乘以任何数字。 例如,这就是十进制位移的工作方式:

1234 >> 0 = 1234
1234 >> 1 = 0123 #discards the last digit.
0123 >> 2 = 0001 #discards the last two digit

因此,以十进制表示时,向右移动数位类似于将整数除以10。当移动两位数时,其等于由10 ^ 2除。

现在,计算机可以处理二进制单词。 因此,我们没有位移,而是有位移。

10101011 >> 1 = 01010101

这基本上除以2 ^ 1。

10101011 >> n仅被2 ^ n除。 现在以相同的方式,将10101011 << n乘以2 ^ n。 这将在二进制字后面添加n个零。

希望现在更清楚:)

干杯

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM