2011-12-15 22 views
2

Javaのビットシフトとビット単位の動作を再現しようとしています。Javaでビットシフト、ビット単位の操作を複製する方法

これまでこれをやろうとしたことがありますか?また、ロングでも確実に一貫してどのように対応できますか?

var i=[some array with large integers]; 
    for(var x=0;x<100;x++) 
    { 
    var a=a large integer; 

    var z=some 'long'>2.1 billion; 
    //EDIT: 
    z=i[x]+=(z>>>5)^(a<<2))+((z<<4)^(a<<5)); 

    } 

これをjavaに入れるにはどうすればよいですか?

+0

を行うことによってlongの32の下位ビットを得ることができますか? Javaは、ビットシフトとビット単位の操作をJavascriptと同様の方法でサポートしています(&?<< >> >>>など)。実際に何が問題になっていますか? – Deco

+0

yaはそれが整数の最大値とlongの境界まで来るまで同様です。私はいくつかのjavascriptをjavaに翻訳しようとしており、ビットシフト操作とのマッチングは非常に困難です。Javascriptはビットシフトオペランドのすべてを32ビット整数に変換します。 javascript:var zz = 123456789123 << 20が出ます:-1473249280。 、javaで同じ:long k = 123456789123L << 20;は129453826111438848になります –

+0

Javaで望ましくない動作を複製したかったのですか? o_O – shinkou

答えて

0

一つの方法は、(int型キャストとビットシフト演算のオペランドを単離し、そして長いキャストと加算/減算演算のオペランドを分離することです加算演算それらなしintに2億を超え、およびJavaにはないながら、Javascriptを自動的に、int型にbitshiftsに憧れるキャスト:

 long z=(long)(((int)z>>>5)^((int)a<<2))+(long)(((int)z<<4)^((int)a<<5)); 
2

はい。 Javaはbit-wise operatorsshift operatorsです。

特に質問したいことがありますか?

編集:ああ、シフトする前にちょうどintにキャストしてください。

int zz = ((int) 123456789123L) << 20; 

JavaScriptが表示されているのと同じように-1473249280が表示されます。

edit2:このようなものがほしいですか? Javaはキャストするので、JavaScriptからJavaへのビットシフト及び加算演算を翻訳する

long[] i=[some array with large integers]; 
    for(int x=0; x < 100; x++) 
    { 
    int a= (int) <a large integer>; // cast in case it's a long or something 
    long z= <some 'long' gt 2.1 billion>; 
    z=i[x]+=((int) z)>>>5)^(a<<2)); 
    } 
2

Javaは大規模で、かつ、同じように動作ビット演算子た存在。しかし微妙な違いです。

Javaのintタイプには、JavaScriptの>>>オペレータは、32ビット符号なし整数値を返し、そう

"" + ((1 << 31) >>> 0) 

"2147483648" 
JavaScriptで

が、同じ表現を生成し、次のに対し、32ビット符号付きであります生成する。

"-2147483648" 

Javaで生成する。

Javaのlongタイプを使用すると、JavaScriptのビット操作を複製するために必要な精度がすべて得られますが、>>>を使用する場合は32ビットの符号付きビットにマスクする必要があります。シフト量は0(または32の倍数)。

あなたは、私はあなたの実際の質問が何であるかわからないんだけど

(myLong & 0xffffffffL) 
関連する問題