0

一部の C++ コードを Java コードに移植しています。

Java には 64 ビットを保持できる unsigned データ型はありません。

longJavaのデータ型(もちろん署名されています)に格納されているハッシュコードがあります。

long vp = hashcode / 38; // hashcode is of type 'long'

ここで 38 は 2 より大きいため、結果の数値は Java の他の算術演算に安全に使用できます。

問題は、「hashcode」の符号付きビットが 1 に設定されている場合はどうなるかです。変数 vp で負の値を取得したくありません。データ型が符号なしであるかのように、正の値が必要でした。

PS: パフォーマンスの問題のため、この目的で Biginteger を使用したくありません。

4

3 に答える 3

5

Java のプリミティブな整数型は符号付きと見なされ、それに対してできることは実際には何もありません。ただし、必要なものによっては、これは問題にならない場合があります。

整数はすべて 2 の補数で処理されるため、バイナリ レベルでは符号付きと符号なしはまったく同じです。違いは、それらを解釈する方法と、特定の操作です。具体的には、右シフト、除算、モジュラス、および比較が異なります。符号なし右シフトは、演算子で実行できます>>>。欠落している演算子のいずれかが必要でない限り、longs を完全にうまく使用できます。

于 2012-10-29T02:09:42.857 に答える
1

サードパーティのライブラリを使用できる場合は、たとえば Guava のUnsignedLongsクラスを使用longして、除算を含む多くの目的で値を符号なしとして扱うことができます。(開示:私はGuavaに貢献しています。)

于 2012-10-29T05:05:15.493 に答える
0

さて、これが私がこれを解決した方法です。ハッシュコードを 1 ビット右シフト (2 で除算)。次に、右にシフトした数値を 19 (3​​8/2) で割ります。したがって、基本的に、C ++で行われるのとまったく同じように、数値を38で割りました。私はC ++で得たものと同じ値を得ました

于 2012-10-30T21:41:10.090 に答える