次のコードは、標準JavaライブラリのArrayDequeのコードです。私は、このアイデアの多くの例がコード全体にあるので、それをやや恣意的に選んだ。私はそれを読むよう配列操作におけるビット演算と通常演算の混同(java)
public void addFirst(E e) {
if (e == null)
throw new NullPointerException();
elements[head = (head - 1) & (elements.length - 1)] = e;
if (head == tail)
doubleCapacity();
}
基本的には、ヘッドの値が1つ減少した後、ビット単位elements.lengthマイナス1で「AND演算」されます。この操作は、配列のどのインデックスが新しい値eを保持するかを決定し、配列の先頭に循環ラップを戻します。 OKこれまで(私は間違っていないと思います)。
しかし、その後、私たちはラインに来る:
if (head == tail) doubleCapacity();
頭と尾はint型です。たとえビットが "anded"(配列がいっぱいで展開しなければならないことを意味する)の後、配列内の同じ位置に等しくても、それらはintと同じになりません(これはテストされているものですか?
だから私はこの仕組みが見えない。
誰でも手助けできますか?
私は配列のインデックスを参照しています。要素のインデックスは参照していません。
head
ints_と同じにならないということはどういう意味ですか? 'head'が' 10'の値を格納し、 'tail'が' 10'の値を格納する場合、それらは等しくなります。 –
int変数headとtailの値が異なることを意味します。ブール値が追加された後、配列内の同じ位置を指しています...オーバーフローのために...しかし、それらは同じ値を持っていません。 – RCM
'head'と' index'は配列要素のインデックスではありません。 –