[英]Faster way to multiply in javascript?
我正在寻找在JavaScript中快速乘法的方法,我发现了这一点
里面有这段文字
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
但是,这似乎不适用于我。 有人知道怎么了吗?
谢谢
忽略该文章。 它的目的是幽默-它所提供的建议是故意的,是错误的。
乘法不涉及“昂贵的对数查询表和极其幸运的猜测”与“每秒数十次猜测”。 这是高度优化的硬件操作,任何现代CPU 每秒都可以执行数亿个 (或更多!)这些操作。
按位运算并不比Javascript中的乘法快。 实际上,它们要慢得多-默认情况下,数字通常默认存储为双精度浮点,因此执行按位运算要求将其转换为整数,然后转换为整数。
移位并不等于本文所暗示的乘法。 虽然左移0和1等于乘以1和2,但模式继续<<2
和<<3
等于乘以4和8 ,而不是3和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.