次のJAVAステートメントを検討してください。
System.out.println(3232235776l & 0xFFFFFFFE);
出力は次のとおりです。3232235776
JavaScriptでステートメントを書き直すと、次のようになります。
console.log(3232235776 & 0xFFFFFFFE);
出力は次のとおりです: -1062731520
Q. JavaScript でこのオーバーフローを回避し、正しい出力を得る方法はありますか?
簡単にするために、Java から変換した関数は投稿しませんでした。ここにあります。Java と JavaScript の両方でブラックボックスが動作していると仮定ipToLong
してくださいlongToIp
(つまり、Java と JS の両方で、適切な ip から long int への変換、およびその逆を正しく実行し、linted および単体テストを行います)。
ここから取得: https://stackoverflow.com/a/5032908/504674
さて、誰かが以下の Java 行を JavaScript に正しく変換するのを手伝ってくれませんか?
具体的には: long maskedBase = start & mask;
.
変換する全機能:
public static List<String> range2cidrlist( String startIp, String endIp ) {
int[] CIDR2MASK = new int[] { 0x00000000, 0x80000000,
0xC0000000, 0xE0000000, 0xF0000000, 0xF8000000, 0xFC000000,
0xFE000000, 0xFF000000, 0xFF800000, 0xFFC00000, 0xFFE00000,
0xFFF00000, 0xFFF80000, 0xFFFC0000, 0xFFFE0000, 0xFFFF0000,
0xFFFF8000, 0xFFFFC000, 0xFFFFE000, 0xFFFFF000, 0xFFFFF800,
0xFFFFFC00, 0xFFFFFE00, 0xFFFFFF00, 0xFFFFFF80, 0xFFFFFFC0,
0xFFFFFFE0, 0xFFFFFFF0, 0xFFFFFFF8, 0xFFFFFFFC, 0xFFFFFFFE,
0xFFFFFFFF
};
long start = ipToLong(startIp);
long end = ipToLong(endIp);
ArrayList<String> pairs = new ArrayList<String>();
while ( end >= start ) {
byte maxsize = 32;
while ( maxsize > 0) {
long mask = CIDR2MASK[maxsize -1];
long maskedBase = start & mask;
if ( maskedBase != start ) {
break;
}
maxsize--;
}
double x = Math.log( end - start + 1) / Math.log( 2 );
byte maxdiff = (byte)( 32 - Math.floor( x ) );
if ( maxsize < maxdiff) {
maxsize = maxdiff;
}
String ip = longToIp(start);
pairs.add( ip + "/" + maxsize);
start += Math.pow( 2, (32 - maxsize) );
}
return pairs;
}