I guess the thing here is that bit operators are not really "in you face" in Java. If you are programming in assembler, or even C, bits will be what you know. Programming at a higher level, you may not be that aware of bit functions and how to use them in real life. You should, but many are not.
The second approach by gojomo here is neat and effective and works directly at the bits instead of bloating with creating Strings and other objects for this simple task. So it's not the fault of the tool, it about the abstraction level people are thinking in.
static int nextOne(int theInt) {
int answer = 1;
while (answer < theInt && 0 < answer) {
answer <<= 1;
}
if (answer < 1) {
throw new IllegalArgumentException("Sorry, " +
theInt + " is bigger than 2 to the power of 30 (1073741824).");
}
return answer;
}
And if we weren't being literal-minded about the original request, it might make sense to just return the exponent rather than the power-of-2 itself, and let the caller worry about overflows:
static int ceilLog2(long val) {
return BigInteger.valueOf(val-1).bitLength();
}
Of course we are ignoring negative exponents, in the integer spirit of the original question.
I guess the thing here is that bit operators are not really "in you face" in Java. If you are programming in assembler, or even C, bits will be what you know. Programming at a higher level, you may not be that aware of bit functions and how to use them in real life. You should, but many are not.
The second approach by gojomo here is neat and effective and works directly at the bits instead of bloating with creating Strings and other objects for this simple task. So it's not the fault of the tool, it about the abstraction level people are thinking in.