私の推測では、コードのやり方が複雑になると思います。たとえば、「3で左シフト」した場合、-3のフィールド(シフト3)を追加することができます(または、3、私は50%の確率しか得られません:-)。また、get()メソッドとset()メソッドでは、shiftでbitIndexを調整するだけでコードが機能します。例えば
public boolean get(int bitIndex) {
bitIndex += shift; // new code!!!
if (bitIndex < 0)
throw new IndexOutOfBoundsException("bitIndex < 0: " + bitIndex);
checkInvariants();
int wordIndex = wordIndex(bitIndex);
return (wordIndex < wordsInUse)
&& ((words[wordIndex] & (1L << bitIndex)) != 0);
}
しかし、intersects()やor()のようないくつかの操作では、コードが本当に乱雑になり始めます。両方のビット集合が可能なシフトが、これは速い厄介になるだろうしていた場合
// Perform logical OR on words in common
for (int i = 0; i < wordsInCommon; i++)
words[i] |= set.words[i];
// Copy any remaining words
if (wordsInCommon < set.wordsInUse)
System.arraycopy(set.words, wordsInCommon,
words, wordsInCommon,
wordsInUse - wordsInCommon);
:今か()メソッドのコアは非常にシンプルで早いのが特長です。彼らはおそらくあなたがシフトしたいなら、getとcopyを使うべきだと考えたでしょう。
get()で私を驚かせたことの1つは、1L << bitIndex&31
です。明らかに< <ループがあります。これで、私は遠くの機械語を覚えています。
「セット」なので、「文字列」ではありません。 – bmargulies
@bmargulies: 'long'も文字列ではありません。それにもかかわらず、シフト演算子があります。そして 'String'は実際にはありません。そして、 'get(i、j)'セマンティクスは基本的に 'substring'と一致し、' long'では利用できません。 –
'set'は '* unordered * collection'を意味します。 BitSetは、2のどの累乗がオンになっているかを知っていますが、シャッフルしているわけではありません。 – bmargulies