50

IP アドレス情報を処理するページに取り組んでいますが、整数が署名されているという事実が原因で窒息しています。ビット単位の演算子を使用して高速化していますが、64 番目のビット (符号付き/符号なしフラグ) がめちゃくちゃです。

Javascriptで数値を強制的に無署名にする方法はありますか? サブネットが 30 を超えるか 2 未満になるまで、問題なく動作しているようです。

これを試して:

<html>
    <body>
    
    <script type='text/javascript'>
    document.write( (1 << 30) +"<br/>");
    document.write( (1 << 31) +"<br/>");
    document.write( (1 << 32) +"<br/>");
    </script>
    
    </body>
</html>

結果:

1073741824 -2147483648 1

4

7 に答える 7

93
document.write( (1 << 31) +"<br/>");

演算子は、<<符号付き 32 ビット整数 (倍精度浮動小数点数のネイティブ Number ストレージから変換) で動作するように定義されています。したがって1<<31、負の数になる必要があります。

符号なし 32 ビット整数を使用して機能する唯一の JavaScript 演算子は>>>. これを利用して、他のビット演算子で取り組んできた符号付き整数を符号なし整数に変換できます。

document.write(( (1<<31)>>>0 )+'<br />');

その間:

document.write( (1 << 32) +"<br/>");

すべてのシフト操作はシフトの最下位 5 ビットのみを使用するため (JavaScript やその他の C に似た言語でも)、機能しません。<<32に等しい<<0、すなわち。変化なし。

于 2009-12-15T16:31:22.367 に答える
9

>> の代わりに >>> を使用して、符号拡張の代わりに符号なし右シフトを取得します。int が符号付きかどうかに関係なく、他のすべてのビット演算子は同じように動作します。

「サブネット...が2未満の場合」というコードの破損が懸念されます。整数の符号とは関係のないバグがあるようです。

于 2009-12-15T16:13:41.153 に答える
6

Javascriptには整数がなく、すべての数値は実際にはdoubleです。

MozillaによるJavascript1.5リファレンスは、32ビット数に対してのみビット単位の演算を安全に使用できることを示唆しています。

于 2009-12-15T16:08:56.153 に答える
4

ipv4アドレスをjavascriptの符号なし整数との間で変換する2つの関数を次に示します。

function ip2long(ip) {
    var ipl=0;
    ip.split('.').forEach(function( octet ) {
        ipl<<=8;
        ipl+=parseInt(octet);
    });
    return(ipl >>>0);
}

function long2ip (ipl) {
    return ( (ipl>>>24) +'.' +
        (ipl>>16 & 255) +'.' +
        (ipl>>8 & 255) +'.' +
        (ipl & 255) );
}
于 2011-09-14T10:17:43.753 に答える
0

どんなIPアドレスを持っていますか?IPv4は32ビットアドレスのみを使用するため、JavaScriptで問題ありません(doubleを使用すると52ビット整数部分になります)。IPv6は128ビットアドレスを使用するため、配列を使用する必要があります。私の推測では、何か他のものが壊れていると思います。

[編集]内部データ型として2つのintの配列を使用する小さなライブラリを構築します。

于 2009-12-15T16:11:59.880 に答える