docs: public void shiftValuesLeft(final int numberOfBinaryOrdersOfMagnitude) {
          if (numberOfBinaryOrdersOfMagnitude < 0) {
              throw new IllegalArgumentException("Cannot shift by a negative number of magnitudes");
          }
  
          if (numberOfBinaryOrdersOfMagnitude == 0) {
              return;
          }
          if (getTotalCount() == getCountAtIndex(0)) {
              // (no need to shift any values if all recorded values are at the 0 value level:)
              return;
          }
  
          final int shiftAmount = numberOfBinaryOrdersOfMagnitude << subBucketHalfCountMagnitude;
          int maxValueIndex = countsArrayIndex(getMaxValue());
          // indicate overflow if maxValue is in the range being wrapped:
          if (maxValueIndex >= (countsArrayLength - shiftAmount)) {
              throw new ArrayIndexOutOfBoundsException(
                      "Operation would overflow, would discard recorded value counts");
          }
  
          long maxValueBeforeShift = maxValueUpdater.getAndSet(this, 0);
          long minNonZeroValueBeforeShift = minNonZeroValueUpdater.getAndSet(this, Long.MAX_VALUE);
  
          boolean lowestHalfBucketPopulated = (minNonZeroValueBeforeShift < subBucketHalfCount);
  
          // Perform the shift:
          shiftNormalizingIndexByOffset(shiftAmount, lowestHalfBucketPopulated);
  
          // adjust min, max:
          updateMinAndMax(maxValueBeforeShift << numberOfBinaryOrdersOfMagnitude);
          if (minNonZeroValueBeforeShift < Long.MAX_VALUE) {
              updateMinAndMax(minNonZeroValueBeforeShift << numberOfBinaryOrdersOfMagnitude);
          }
      }