>>と>>>の違い

前文

HashMapのソースを見ているときは、操作2 >>オペレータに加えて、使用する前に、多くの場合、演算子を>>>すると便利ですHashMapのハッシュ関数を参照してください、それでも>>>最初のこぎりので、彼らは来ますそれを記録。

シナリオ再現

HashMapのハッシュ関数ソース

HashMapのハッシュ関数ソース

それは、JVMを生成しているのhashCodeキーの最初の主要な買収であるので、私は1つのシミュレーションのhashCode単独だから

System.out.println((h = 1) ^ (h >>> 16));

結果は以下の通りであります

情景复现: 1

ステップ決意

このコードは、計算によって得られたコードの3つのセクションから構成され

  1. 1 H直接割り当て
  2. H >>> 16位
  3. ステップ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 /

おすすめ

転載: www.cnblogs.com/cartooon/p/11455481.html