docs: public static void mergeBloomFilterByteBuffers(
        ByteBuffer bf1Buffer,
        int bf1Start,
        ByteBuffer bf2Buffer,
        int bf2Start
    )
    {
      ByteBuffer view1 = bf1Buffer.duplicate().order(ByteOrder.BIG_ENDIAN);
      ByteBuffer view2 = bf2Buffer.duplicate().order(ByteOrder.BIG_ENDIAN);
      final int bf1Length = START_OF_SERIALIZED_LONGS + (view1.getInt(1 + bf1Start) * Long.BYTES);
      final int bf2Length = START_OF_SERIALIZED_LONGS + (view2.getInt(1 + bf2Start) * Long.BYTES);
  
      if (bf1Length != bf2Length) {
        throw new IllegalArgumentException("bf1Length " + bf1Length + " does not match bf2Length " + bf2Length);
      }
  
      // Validation on the bitset size/3 hash functions.
      for (int idx = 0; idx < START_OF_SERIALIZED_LONGS; ++idx) {
        if (view1.get(bf1Start + idx) != view2.get(bf2Start + idx)) {
          throw new IllegalArgumentException("bf1 NumHashFunctions/NumBits does not match bf2");
        }
      }
  
      // Just bitwise-OR the bits together - size/# functions should be the same,
      // rest of the data is serialized long values for the bitset which are supposed to be bitwise-ORed.
      for (int idx = START_OF_SERIALIZED_LONGS; idx < bf1Length; ++idx) {
        final int pos1 = bf1Start + idx;
        final int pos2 = bf2Start + idx;
        view1.put(pos1, (byte) (view1.get(pos1) | view2.get(pos2)));
      }
    }