簡體   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