前文
HashMapのソースを見ているときは、操作2 >>オペレータに加えて、使用する前に、多くの場合、演算子を>>>すると便利ですHashMapのハッシュ関数を参照してください、それでも>>>最初のこぎりので、彼らは来ますそれを記録。
シナリオ再現
HashMapのハッシュ関数ソース
それは、JVMを生成しているのhashCodeキーの最初の主要な買収であるので、私は1つのシミュレーションのhashCode単独だから
System.out.println((h = 1) ^ (h >>> 16));
結果は以下の通りであります
情景复现: 1
ステップ決意
このコードは、計算によって得られたコードの3つのセクションから構成され
- 1 H直接割り当て
- H >>> 16位
- ステップ1と排他的論理和演算の2
したがって、結果は、結果0 16 1から推定>>>
テスト
System.out.println("-12>>>2结果为:"+Integer.toBinaryString(-12>>>2));
System.out.println("12>>>2结果为:"+Integer.toBinaryString(12>>>2));
System.out.println("-12>>2结果为:"+Integer.toBinaryString(-12>>2));
System.out.println("12>>2结果为:"+Integer.toBinaryString(12>>2));
-12>>>2结果为:111111111111111111111111111101
12>>>2结果为:11
-12>>2结果为:11111111111111111111111111111101
12>>2结果为:11
分析
結果から分かるように、正の数を使用して操作を行う>>と>>>結果は変わらなかったが、変更が動作して負の場合、この比較は、操作と符号ビットを示しています>>>心配。
- 正数操作
ビット操作に、フロントInteger.toBinaryString 0を出力する出力方法を使用することなく、2つの演算子がnビット0だけ右に動作していることを推測することができます
- 負の操作
負ストレージがその補数であるので、補数バイナリストリング、正のオペランドより長い時間の長さを生成する明らかな算術>>>を行う際に、バイナリ符号ビットにおけるJavaは区別されませんので、10進表現の最後の数が異常に大きくなります。
概要
二つの演算子は、フォワード操作を行うシフトの数は同じです。アップ>> 0、負の数値を扱うときただし、操作は符号なしです。>>> 1とアップ、それが署名された動作です。
この記事では最初に登場した漫画のブログ
のソースを明記してください。https://cartoonyu.github.io/cartoon-blog/post/java/%E6%97%A0%E7%AC%A6%E5%8F%B7%E8 %BFの%90%E7%AEは %97%E7%の交流%A6%のE4の%のB8%8E%E6の%9C%89%E7%以下のAC%A6%E5%8F%B7%E8%以下のBF%90%E7%AE %97%E7%の交流%A6 %E7%以下の(a)の%84%E5の%8C%のBA%E5%88%AB /