符号なし整数にJavascript
-
19-09-2019 - |
質問
仕事をしているページプロセスの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
解決
document.write( (1 << 31) +"<br/>");
<<
演算子は、符号付き32ビット整数(倍精度浮動小数点のネイティブ番号記憶から変換)で作業として定義されます。だから、1<<31
は負の数になる必要があります。
の符号なし32ビット整数を使用して動作するだけのJavaScript演算子は>>>
あります。
document.write(( (1<<31)>>>0 )+'<br />');
一方ます:
document.write( (1 << 32) +"<br/>");
全てのシフト操作(すぎるJavaScriptと他のC-ような言語で)シフトのみ最下位5ビットを使用するので、動作しません。 <<32
は<<0
、すなわちに等しいです。変更なします。
他のヒント
の代わりに符号拡張1の符号なし右シフトを取得するには>>を使用し>>>代わりに。他のすべてのビット演算子には関係なく、int型が署名されているかどうかのと同じように動作します。
「サブネット...が2未満であるとき、」壊すあなたのコードが懸念されます。あなたが整数の符号の有無とは無関係のいくつかのバグを持っていることのようにそれが鳴ります。
ダグラスCrockfordとビット単位のオペレーターの悪いパーツのjavascript:
Javaにおいて、ビット単位で事業者仕事の整数です。JavaScriptではない整数です。では倍精度浮動小数点数です。なので、ビット単位で作業者に変換数のオペランドへの整数、その事業に変換します。ほとんどの言語で、これらの事業者もあり、ハードウェアおよびます。 JavaScriptでは、非常にハードウェアと非常に遅くなります。 当サイトでは、以下のブラウザが使用されることが少ないビット操作が可能です。
--ダグラスCrockfordに"JavaScript:のパーツ"付録Bでは、ビット単位の者を
せていただきましたビット単位で事業者にもスピードロジック?
Javascriptが整数を持っていない、すべての数値は、実際に倍増されます。
Mozillaののことで Javascriptを1.5リファレンスは1のみ使用することができますことを示唆しています32ビット番号の安全ビット単位のオペレーション
ここでは、JavaScriptで符号なし整数へ/からのIPv4アドレスを変換する二つの機能があります:
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) );
}
あなたはIPアドレスのどのような種類がありますか? JavaScriptは、あなたに 52bitの整数部分を与えるダブルを使用して(問題ないはずですので、IPv4のは、唯一の32ビットアドレスを使用しています)。 IPv6は128ビットのアドレスを使用していますので、あなたは、配列を使用する必要があります。私の推測では、他の何かが壊れているということです。
[EDIT]内部データ・タイプのような2つのintの配列を使用して小さなライブラリーを構築します。