@Override
 public DirectBitSet andNot(long longIndex, long value) {
   long l = bytes.readLong(longIndex << 3);
   long l2 = l & ~value;
   bytes.writeLong(longIndex << 3, l2);
   return this;
 }
 @Override
 public DirectBitSet setAll() {
   for (long i = 0; i < longLength; i++) {
     bytes.writeLong(i << 3, ~0L);
   }
   return this;
 }
  @Override
  public DirectBitSet flip(long fromIndex, long exclusiveToIndex) {
    long fromLongIndex = fromIndex >> 6;
    long toIndex = exclusiveToIndex - 1;
    long toLongIndex = toIndex >> 6;
    if (fromIndex < 0 || fromIndex > exclusiveToIndex || toLongIndex >= longLength)
      throw new IndexOutOfBoundsException();

    if (fromLongIndex != toLongIndex) {
      long firstFullLongIndex = fromLongIndex;
      if ((fromIndex & 0x3F) != 0) {
        long fromByteIndex = fromLongIndex << 3;
        long mask = (~0L) << fromIndex;
        long l = bytes.readLong(fromByteIndex);
        long l2 = l ^ mask;
        bytes.writeLong(fromByteIndex, l2);
        firstFullLongIndex++;
      }

      if ((exclusiveToIndex & 0x3F) == 0) {
        for (long i = firstFullLongIndex; i <= toLongIndex; i++) {
          bytes.writeLong(i << 3, ~bytes.readLong(i << 3));
        }
      } else {
        for (long i = firstFullLongIndex; i < toLongIndex; i++) {
          bytes.writeLong(i << 3, ~bytes.readLong(i << 3));
        }

        long toByteIndex = toLongIndex << 3;
        // >>> ~toIndex === >>> (63 - (toIndex & 0x3F))
        long mask = (~0L) >>> ~toIndex;
        long l = bytes.readLong(toByteIndex);
        long l2 = l ^ mask;
        bytes.writeLong(toByteIndex, l2);
      }
    } else {
      long byteIndex = fromLongIndex << 3;
      long mask = ((~0L) << fromIndex) & ((~0L) >>> ~toIndex);
      long l = bytes.readLong(byteIndex);
      long l2 = l ^ mask;
      bytes.writeLong(byteIndex, l2);
    }
    return this;
  }
 @Override
 public DirectBitSet flip(long bitIndex) {
   long longIndex = bitIndex >> 6;
   if (bitIndex < 0 || longIndex >= longLength) throw new IndexOutOfBoundsException();
   long byteIndex = longIndex << 3;
   // only 6 lowest-order bits used, JLS 15.19
   long mask = 1L << bitIndex;
   long l = bytes.readLong(byteIndex);
   long l2 = l ^ mask;
   bytes.writeLong(byteIndex, l2);
   return this;
 }
 @Override
 public DirectBitSet clear(long bitIndex) {
   long longIndex = bitIndex >> 6;
   if (bitIndex < 0 || longIndex >= longLength) throw new IndexOutOfBoundsException();
   long byteIndex = longIndex << 3;
   long mask = 1L << bitIndex;
   long l = bytes.readLong(byteIndex);
   if ((l & mask) == 0) return this;
   long l2 = l & ~mask;
   bytes.writeLong(byteIndex, l2);
   return this;
 }
 @Override
 public boolean setIfClear(long bitIndex) {
   long longIndex = bitIndex >> 6;
   if (bitIndex < 0 || longIndex >= longLength) throw new IndexOutOfBoundsException();
   long byteIndex = longIndex << 3;
   long mask = 1L << bitIndex;
   long l = bytes.readLong(byteIndex);
   long l2 = l | mask;
   if (l == l2) return false;
   bytes.writeLong(byteIndex, l2);
   return true;
 }