docs: public void andNot(final Roaring64NavigableMap x2) {
      boolean firstBucket = true;
  
      Iterator<Entry<Integer, BitmapDataProvider>> thisIterator = highToBitmap.entrySet().iterator();
      while (thisIterator.hasNext()) {
        Entry<Integer, BitmapDataProvider> e1 = thisIterator.next();
  
        // Keep object to prevent auto-boxing
        Integer high = e1.getKey();
  
        BitmapDataProvider lowBitmap2 = x2.highToBitmap.get(high);
  
        if (lowBitmap2 != null) {
          BitmapDataProvider lowBitmap1 = e1.getValue();
  
          if (lowBitmap2 instanceof RoaringBitmap && lowBitmap1 instanceof RoaringBitmap) {
            ((RoaringBitmap) lowBitmap1).andNot((RoaringBitmap) lowBitmap2);
          } else if (lowBitmap2 instanceof MutableRoaringBitmap
              && lowBitmap1 instanceof MutableRoaringBitmap) {
            ((MutableRoaringBitmap) lowBitmap1).andNot((MutableRoaringBitmap) lowBitmap2);
          } else {
            throw new UnsupportedOperationException(
                ".and is not between " + this.getClass() + " and " + lowBitmap1.getClass());
          }
        }
  
        if (firstBucket) {
          firstBucket = false;
  
          // Invalidate the lowest high as lowest not valid
          firstHighNotValid = Math.min(firstHighNotValid, high);
          allValid = false;
        }
      }
    }