code: @SuppressWarnings("fallthrough")
    // TODO(kevinb): remove after this warning is disabled globally
    public static int log2(int x, RoundingMode mode) {
      checkPositive("x", x);
      switch (mode) {
        case UNNECESSARY:
          checkRoundingUnnecessary(isPowerOfTwo(x));
          // fall through
        case DOWN:
        case FLOOR:
          return (Integer.SIZE - 1) - Integer.numberOfLeadingZeros(x);
  
        case UP:
        case CEILING:
          return Integer.SIZE - Integer.numberOfLeadingZeros(x - 1);
  
        case HALF_DOWN:
        case HALF_UP:
        case HALF_EVEN:
          // Since sqrt(2) is irrational, log2(x) - logFloor cannot be exactly 0.5
          int leadingZeros = Integer.numberOfLeadingZeros(x);
          int cmp = MAX_POWER_OF_SQRT2_UNSIGNED >>> leadingZeros;
          // floor(2^(logFloor + 0.5))
          int logFloor = (Integer.SIZE - 1) - leadingZeros;
          return logFloor + lessThanBranchFree(cmp, x);
  
        default:
          throw new AssertionError();
      }
    }
docs: Returns the base-2 logarithm of {@code x}, rounded according to the specified rounding mode.
  
  @throws IllegalArgumentException if {@code x <= 0}
  @throws ArithmeticException if {@code mode} is {@link RoundingMode#UNNECESSARY} and {@code x}
  is not a power of two