docs: public static long[] shiftRightI(long[] v, int off) {
      if(off == 0) {
        return v;
      }
      if(off < 0) {
        return shiftLeftI(v, -off);
      }
      // 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 zeroI(v);
      }
      // Simple case - multiple of word size
      if(shiftBits == 0) {
        // Move whole words down
        System.arraycopy(v, shiftWords, v, 0, v.length - shiftWords);
        // Fill top words with zeros
        Arrays.fill(v, v.length - shiftWords, v.length, 0);
        return v;
      }
      // Overlapping case
      final int unshiftBits = Long.SIZE - shiftBits;
      // Bottom-up to not overlap the operations.
      for(int i = 0; i < v.length - shiftWords - 1; i++) {
        final int src = i + shiftWords;
        v[i] = (v[src + 1] << unshiftBits) | (v[src] >>> shiftBits);
      }
      // The last original word
      v[v.length - shiftWords - 1] = v[v.length - 1] >>> shiftBits;
      // Fill whole words "lost" by the shift
      Arrays.fill(v, v.length - shiftWords, v.length, 0);
      return v;
    }