docs: public static long[] andI(long[] v, long[] o, int off) {
      if(off == 0) {
        return andI(v, o);
      }
      // Break shift into integers to shift and bits to shift
      final int shiftWords = off >> LONG_LOG2_SIZE;
      final int shiftBits = off & LONG_LOG2_MASK;
  
      if(shiftWords >= v.length) {
        return v;
      }
      // Simple case - multiple of word size
      if(shiftBits == 0) {
        int i = Math.min(v.length, o.length + shiftWords), j = i - shiftWords;
        while(i > 0 && j > 0) {
          v[--i] &= o[--j];
        }
        // Clear bottom words
        if(shiftWords > 0) {
          Arrays.fill(v, 0, shiftWords, 0);
        }
        return v;
      }
      // Overlapping case
      final int unshiftBits = Long.SIZE - shiftBits;
      int i = Math.min(v.length, o.length + shiftWords), j = i - shiftWords;
      long t = o[--j];
      if(i < v.length) { // partial word of negative shift
        v[i] &= t >>> unshiftBits;
      }
      while(i > 0 && j > 0) {
        v[--i] &= (t << shiftBits) | ((t = o[--j]) >>> unshiftBits);
      }
      if(i > 0) { // partial word of positive shift
        v[--i] &= t << shiftBits;
      }
      // Clear bottom words
      Arrays.fill(v, 0, shiftWords, 0);
      return v;
    }