Twitter API は、276403573577891842 などの 64 ビット整数の ID を返します。ID を比較して、あるツイートが別のツイートよりも新しいかどうかを確認したいと考えています。
2 つの 64 ビット整数を比較して、32 ビット整数のみをサポートする JavaScript でどちらが大きいかを確認する賢い方法はありますか?
Twitter API は、276403573577891842 などの 64 ビット整数の ID を返します。ID を比較して、あるツイートが別のツイートよりも新しいかどうかを確認したいと考えています。
2 つの 64 ビット整数を比較して、32 ビット整数のみをサポートする JavaScript でどちらが大きいかを確認する賢い方法はありますか?
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ではなく文字列を使用していることを除く)。
テキスト<
または>
比較を行うと、それらが実際に数字であり、最大の数値IDが最新のツイートであり、最小のIDが最も古いツイートである場合、問題なく機能するはずです
受け入れられた回答に基づいて使用したものは次のとおりです。
次のように呼び出します。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;
}
他のすべてが失敗した場合は、いつでも ID を文字列として保存し、それを 2 つの半分に分割して、整数として別々に比較できます。