[解決済み] Javaにおけるダブルチルド(~~)の意味を教えてください。
質問
Guavaのソースコードを見ていたら、次のようなコードに出会いました。
hashCode
インナークラス
CartesianSet
):
int adjust = size() - 1;
for (int i = 0; i < axes.size(); i++) {
adjust *= 31;
adjust = ~~adjust;
// in GWT, we have to deal with integer overflow carefully
}
int hash = 1;
for (Set<E> axis : axes) {
hash = 31 * hash + (size() / axis.size() * axis.hashCode());
hash = ~~hash;
}
hash += adjust;
return ~~hash;
の両方が
adjust
と
hash
は
int
s. 私が知っているJavaの知識では
~
はビット単位の否定を意味するので
adjust = ~~adjust
と
hash = ~~hash
は変数を変更しないようにする必要があります。小さなテストを実行する (もちろんアサーションは有効にして)。
for (int i = Integer.MIN_VALUE; i < Integer.MAX_VALUE; i++) {
assert i == ~~i;
}
はこれを確認する。グアバの連中が自分たちのしていることを分かっていると仮定すれば、彼らがこれをする理由があるはずです。問題は、それが何かということです。
EDIT
コメントで指摘されているように、上記のテストは、以下のようなケースを含んでいません。
i
イコール
Integer.MAX_VALUE
. このため
i <= Integer.MAX_VALUE
は常に真なので、永久ループにならないように、ループの外側でそのケースをチェックする必要があります。しかし、行
assert Integer.MAX_VALUE == ~~Integer.MAX_VALUE;
はコンパイラの警告 "同一の式を比較する" を出力し、これはまさに釘付けになります。
どのように解決するのか?
Javaでは、何の意味もありません。
でも、そのコメントには、JavaをJavaScriptにコンパイルするGWTに特化した行だと書いてあります。
JavaScriptでは、整数は「整数と同じ働きをする倍数」のようなものです。たとえば、最大値は2^53です。しかし
ビット演算子
は数字を32ビットとして扱うので、このコードではまさにそれを望んでいるのです。つまり
~~hash
というのは
hash
を32ビットの数値として扱います。具体的には、下位32ビットを除くすべてのビットを破棄します(ビット単位の
~
演算子は下位32ビットしか見ません)、これはJavaのオーバーフローの仕組みと同じです。
もしそれがなかったら、オブジェクトのハッシュコードは、Javaの国で評価されるか、JavaScriptの国で(GWTコンパイルによって)評価されるかによって違ってきます。
関連
-
スレッド "main" で例外発生 java.lang.ArrayIndexOutOfBoundsException: 4 at text.Division.main(Divisi
-
Error: java.lang.NoClassDefFoundError: クラス XXXX を初期化できませんでした
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Javaです。の意味
-
JavaMailのメール送信が失敗するケースとその説明の分析
-
JQuery DataTable 详解
-
Java コンパイルエラー - スレッド "main" で例外 java.lang.Error: 未解決のコンパイル問題です。
-
リソースの読み込みに失敗しました。サーバーはステータス500(内部サーバーエラー)で応答しました。
-
javaでよく使われる英単語
-
mavenプロジェクトのテストエラー java.lang.ClassNotFoundException: org.glassfish.jersey.client.ClientConfig の問題を解決する。
-
JSPで「リストが型解決できない!」の解決方法
-
ローカルリソースのロードが許可されていない場合の解決策
-
[解決済み】ビット単位のOR 0で数値を階数化する方法