比较Javascript中的两个64位整数

时间:2012-12-05 19:53:59

标签: javascript comparison 32bit-64bit

Twitter API返回64位整数的ID,例如276403573577891842.我想通过比较他们的ID来查看一个推文是否比另一个更新。

有没有一种聪明的方法来比较两个64位整数,看看哪个在JavaScript中更大,只支持32位整数?

4 个答案:

答案 0 :(得分:3)

假设API返回的字符串然后被解析为整数,有两种方法可以做到这一点 - 分割方式和填充方式;

<强>分割即可。 这里的想法是将数据拆分为环境可以处理的大小。最大的32位数字是0xFFFFFFFF4294967295。现在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)。

答案 1 :(得分:1)

执行文本<>比较应该没有任何问题,如果它们确实是数字,其中最高的数字ID是最新的推文,最低的ID是最早的

答案 2 :(得分: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;
}

答案 3 :(得分:0)

如果所有其他方法都失败了,您可以随时将ID存储为字符串并将其拆分为两半,然后您可以将它们分别作为整数进行比较。