Ну, так как до сих пор есть только одно решение, которое дает "правильный" результат, и это ... действительно не очень хорошее решение (использование строки для подсчета лидирующих нулей? Это будет преследовать меня в моих снах;))
Итак, мы идем с хорошим чистым решением, которое должно работать - хотя не проверили его полностью, но вы понимаете суть. Действительно, java, не имеющий беззнакового типа, чрезвычайно раздражает для такого рода проблем, но, тем не менее, он должен быть достаточно эффективным (и, если можно так выразиться, НАМНОГО более элегантным, чем создание строки из числа)
private static int invert(int x) {
if (x == 0) return 0; // edge case; otherwise returns -1 here
int nlz = nlz(x);
return ~x & (0xFFFFFFFF >>> nlz);
}
private static int nlz(int x) {
// Replace with whatever number leading zero algorithm you want - I can think
// of a whole list and this one here isn't that great (large immediates)
if (x < 0) return 0;
if (x == 0) return 32;
int n = 0;
if ((x & 0xFFFF0000) == 0) {
n += 16;
x <<= 16;
}
if ((x & 0xFF000000) == 0) {
n += 8;
x <<= 8;
}
if ((x & 0xF0000000) == 0) {
n += 4;
x <<= 4;
}
if ((x & 0xC0000000) == 0) {
n += 2;
x <<= 2;
}
if ((x & 0x80000000) == 0) {
n++;
}
return n;
}