Если вы настаиваете на прямом использовании побитовых операторов, вы можете попробовать что-то вроде этого:
private int mostSignificantBit(int myInt){
int mask = 1 << 31;
for(int bitIndex = 31; bitIndex >= 0; bitIndex--){
if((myInt & mask) != 0){
return bitIndex;
}
mask >>>= 1;
}
return -1;
}
Мы инициализируем маску 1 << 31
, поскольку она представляет 1, а затем 31 0. Мы используем это значение, чтобы проверить, равен ли индекс 31 (32-е место) 1. Когда мы and
это значение с myInt
, мы получим 0, если соответствующий бит не установлен в myInt
. Если это так, мы возвращаем это bitIndex
. Если нет, то мы сдвигаем маску вправо на 1 и пытаемся снова. Мы повторяем, пока у нас не останется места для сдвига, и в этом случае это означает, что ни один из битов не был установлен (возможно, вы хотите выбросить исключение вместо возврата -1).
Обратите внимание, что при этом будет возвращено значение 0
для 1
и 6
для 64
(1000000
в двоичном виде). Вы можете настроить это, если хотите. Также обратите внимание, что я использовал оператор без знака справа, а не смещение вправо со знаком. Это связано с тем, что целью здесь является работа с необработанными битами, а не их подписанная интерпретация, но в данном случае это не имеет значения, поскольку все отрицательные значения завершатся в первой итерации цикла до того, как произойдет смещение.