2

の一部としてのハッシュ関数コードが次のことを行うことに気付きましたjava.util.Hashtable#get(K key): int index = (hash & 0x7FFFFFFF) % tab.length;. このバイナリ「and」操作は、符号ビットをリセットするためだけのものですか? したがって、負のテーブル アクセスは避けてください。

更新: 彼らが 0xEFFFFFFF ではなく 0x7FFFFFFF で「and」しているという事実は、私を困惑させました。符号が 1 ビットではなく完全なバイトを必要とするのはなぜですか?

4

2 に答える 2

5

それは正解です。これは、ハッシュ テーブル内の基になる配列への負のインデックス付けを回避するためです。

C や C++ などの符号なし整数型を使用する言語では、ハッシュ関数で符号なし値を使用するだけでこれを回避できることに注意してください。

編集:0x7FFFFFF理由と対比に関する新しい質問を考えると0xEFFFFFF、これらの数値の最初はすべて 1 で、最上位ビットが 0 に設定されています。これらの 2 番目にはこのプロパティがありません。たくさんの 1が1110続きます。したがって、最初のマスクで 1 ビットがクリアされますが、2 番目のマスクでこれが行われない場合があります。

お役に立てれば!

于 2013-01-20T19:28:04.283 に答える
3

彼らが 0xEFFFFFF ではなく 0x7FFFFFFF と「and」しているという事実は、私を困惑させました。符号が 1 ビットではなく完全なバイトを必要とするのはなぜですか?

0x7FFFFFFF は最上位ビットです。バイナリでは、011111111111111111111111111111 です。0xEFFFFFFF は 1110111111111111111111111111111 なので、別のビットをマスクします。

于 2013-01-20T21:28:18.410 に答える