[英]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.