2017-02-01 4 views
0

GA(google analytics)を見ると、268435455、2147483647はこれらの数字でビット操作を行います。JavaScriptでコード内に大きな数字を直接使用するのはなぜですか?

AirBnBはまた、これらの数字とビット演算子を使用:3266489909、2246822507、3864292196.

例)

function n(e, t) { 
    return (65535 & e) * t + (((e >>> 16) * t & 65535) << 16) & 4294967295 
} 

function r(e) { 
    for (var t = e.length, r = 3432918353, o = 461845907, i = 0, u = void 0, a = t & -4, c = 0; c < a; c += 4) u = e.charCodeAt(c) | e.charCodeAt(c + 1) << 8 | e.charCodeAt(c + 2) << 16 | e.charCodeAt(c + 3) << 24, u = n(u, r), u = u << 15 | u >>> 17, u = n(u, o), i ^= u, i = i << 13 | i >>> 19, i = 5 * i + 3864292196 | 0; 
    switch (u = 0, t % 4) { 
     case 3: 
      u = e.charCodeAt(a + 2) << 16; 
     case 2: 
      u |= e.charCodeAt(a + 1) << 8; 
     case 1: 
      u |= e.charCodeAt(a), u = n(u, r), u = u << 15 | u >>> 17, u = n(u, o), i ^= u 
    } 
    return i ^= t, i ^= i >>> 16, i = n(i, 2246822507), i ^= i >>> 13, i = n(i, 3266489909), i ^= i >>> 16, i >>> 0 
} 

それは、このように動作しますなぜ私が疑問に思って。

+1

'268435455..toString(2)===「1111111111111111111111111111'' – Ryan

+0

100101を...長い進数のバイナリコードが意味するのでしょうか。? – Integral

+0

'268435455 ===(1 << 28) - 1'。マジックナンバーはビット操作では一般に受け入れられます。 – 4castle

答えて

0

は奇数の合成番号である。それは一緒に乗算された6つの異なる素数で構成されています。それには合計64の約数があります。 268435455の

プライム分解: 3×5×29×43×113×127

wikipediaによれば、数は2^31に等しく、第Mersenne prime - それは1である1わずか4つの既知のdouble Mersenne primesです。これは、計算で32ビット符号付き2進整数の最大正の値です。この数についての素晴らしい点は、2,147,483,647が1867年まで最大の既知の素数のままであったことです。

同様に、他の数字も計算に関連する重要性を持っています。

0

指紋印刷に使用される値のようです。

完全性のチェックに使用されているようです。

コードは上記のコードに似ています。

here

+0

https://en.wikipedia.org/wiki/MurmurHash>アルゴリズム 3432918353は0xcc9e2d51、 は461845907は0x1b873593、 は3864292196は0xe6546b64 – Integral

関連する問題