@SuppressWarnings("fallthrough")
  // TODO(kevinb): remove after this warning is disabled globally
  public static int log2(int x, RoundingMode mode) {
    """
	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
    """
    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();
    }
  }
@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();
    }
  }
@ 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 ( ) ; } }
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
Returns the base - 2 logarithm of { @code x } rounded according to the specified rounding mode .