[JS]整数除算-求商

9304 ワード

1.概要


最近JavaScriptでLeetcoeを解く最も見慣れない部分の一つが整数除算です
考えがなくてMath.floorと書いたが、負数除算では動作と考えが違う
const a = -10
const b = 3

const res = Math.floor(a / b)
console.log('res', res) // -4
負数を落とすことはほとんどないので、一つ一つ見ると
-10 = 3 * -3 + (-1)

몫: -3, 나머지: -1
したがって、-3が現れるはずです.

2. Math.floor


Math.floor-下降

MDNによると、함수는 주어진 숫자와 같거나 작은 정수 중에서 가장 큰 수를 반환합니다.ですから.Math.floor(-10/3)は-4を返します.
正のタイミングで動きがいい.

3. Math.trunc


Math.trunc-破棄

整数部分のみが返されるため、整数と除数の重みを求めるのに適しています.Math.floor(-10/3)は-3を返します.

4. ~~ (not not)


2つのビット非演算子を使用します.
MDNによれば、bitwise notを使用すると、xは−(x+1)を返し、すべての小数点を破棄する.
だから2回重ねて使うと小数点を放棄します
// 3.5 -> -4 -> 3
const a = 3.5

console.log(~a) // -4

console.log(~~a) // 3

5.速度比較


1億回の演算を10回行い,クロムに大きな差はなかった.

1)クロム

  • Math.trunc - 51.58 ms
  • not not - 51.4 ms
  • 2) safari

  • Math.trunc - 1345.6 ms
  • not not - 1341.5 ms
  • Firefoxではしないでください.パソコンが爆発すると思った.
    const a = 10000000000 // 100억
    const b = 777777777 //  7억
    const n = 100000000 // 1억
    const testCase = 10
    let timeSum = 0
    
    for(let t=0; t<testCase; t++) {
        const startTime = performance.now()
    
        for(let i=0; i<n; i++) {
            const res = Math.trunc(a/b)
            // const res = ~~(a/b)
        }
    
        const endTime = performance.now()
    
        timeSum += endTime - startTime
    }
    
    console.log(`평균 속도: ${timeSum / testCase} ms`)

    6.数が多いですね


    ジョー、ジョーン、海...1000年になると少しおかしくなります
    const a = 100000000000000000000000 // 천해
    const b = 30
    
    console.log('Math.floor', Math.floor(a/b)) // Math.floor 3.333333333333333e+21
    console.log('Math.trunc', Math.trunc(a/b)) // Math.trunc 3.333333333333333e+21
    console.log('not not', ~~(a/b)) // not not -435159040
    

    7.個人的な意見


    実際、ブラウザでは10回の除算演算はめったに行われません.
    これらの演算をアルゴリズムまたは単純演算に限定すると、1兆回未満の演算に限定される.
    速くて負数除算もサポートされている~~(not)
    考えているだけです.
    Pythonもmath.truncを使用して負数除算をサポートする必要があり、//だけを使用しても問題ありません.
    アルゴリズムを解くときはあまり負数除算がないようです.
    しかし、機械が勉強するときは負数除算に注意しなければならない.
    ....
    だからアルゴリズムを使うときに便利で、負数除算が必要ならそれをサポートしましょう.

    リファレンス


    https://codepen.io/supernova_at/post/javascript-s-double-bitwise-not-operator
    https://www.delftstack.com/ko/howto/javascript/integer-division-javascript/