0

Twitter API は、276403573577891842 などの 64 ビット整数の ID を返します。ID を比較して、あるツイートが別のツイートよりも新しいかどうかを確認したいと考えています。

2 つの 64 ビット整数を比較して、32 ビット整数のみをサポートする JavaScript でどちらが大きいかを確認する賢い方法はありますか?

4

4 に答える 4

3

API が文字列を返し、それが int に解析されると仮定すると、これを行うには分割方法と埋め込み方法の 2 つの方法があります。

スプリット。ここでの考え方は、環境が処理できるサイズにデータを分割することです。最大の 32 ビット数は0xFFFFFFFFまたは4294967295です。今4294967295..toString().length === 10。したがって、str の長さが 9 以下のすべての dec は 32 ビットセーフである必要があります。

function compare(a,b){
    var aa = [0,0,0], ba = [0,0,0], i = 3;
    while (a.length) aa[--i] = parseInt(a.slice(-9)), a = a.slice(0,-9);
    i = 3;
    while (b.length) ba[--i] = parseInt(b.slice(-9)), b = b.slice(0,-9);
    if (aa[0] === ba[0]){
        if (aa[1] === ba[1]) {
            if (aa[2] === ba[2]) return 0;
            else if (aa[2] > ba[2]) return 1;
            return -1;
        } else if (aa[1] > ba[1]) return 1;
        return -1;
    } else if (aa[0] > ba[0]) return 1;
    return -1;
}
// a > b: 1, a = b: 0, a < b: -1

パッド。今回の目的は文字列比較を行うことですが、そのためにはまず (文字列) 数値が同じ長さであることを確認する必要があります。つまり、それらを 0 で埋めます。今回は'18446744073709551615'.length === 20そう

function pad(str, len) { // Your fav. padding fn
    var pre = '0';
    len = len - str.length;
    while (len > 0) {
        if (len & 1) str = pre + str;
        len >>= 1;
        pre += pre;
    }
    return str;
};

a = pad('276403573577891842',20);
b = pad('50',20);

これで、通常どおりに使用できますa === b, a < b, a > b(intではなく文字列を使用していることを除く)。

于 2012-12-05T20:27:09.453 に答える
1

テキスト<または>比較を行うと、それらが実際に数字であり、最大の数値IDが最新のツイートであり、最小のIDが最も古いツイートである場合、問題なく機能するはずです

于 2012-12-05T19:58:57.537 に答える
1

受け入れられた回答に基づいて使用したものは次のとおりです。

次のように呼び出します。if( compare_64('124567891234567890', '>', '124567891234567891') )

function compare_64(a, type, b)
{
var result = false;

var pad_len = (a.length > b.length) ? a.length : b.length;      
var aa = pad(a, pad_len);       
var bb = pad(b, pad_len);

switch(type)
{
    case '<':   
        result = (aa < bb) ? true : false;
        break;
    case '<=':  
        result = (aa <= bb) ? true : false;
        break;
    case '>':   
        result = (aa > bb) ? true : false;
        break;
    case '>=':  
        result = (aa >= bb) ? true : false;
        break;                      
    case '==':  
        result = (aa == bb) ? true : false;
        break;          
}   
return result;
}

// Pad with zeros
function pad(str, len)
{
  var pre = '0';
  len = len - str.length;
  while (len > 0)
{
    if (len & 1) str = pre + str;
    len >>= 1;
    pre += pre;
  }
  return str;
}
于 2012-12-20T23:36:22.840 に答える
0

他のすべてが失敗した場合は、いつでも ID を文字列として保存し、それを 2 つの半分に分割して、整数として別々に比較できます。

于 2012-12-05T20:00:53.040 に答える