Получить длину битов, используемых в int - PullRequest
8 голосов
/ 23 мая 2010

Если у вас есть двоичное число 10110, как я могу заставить его вернуть 11111? например, новое двоичное число, которое устанавливает все биты в 1 после первой 1, также есть несколько аналогичных примеров, перечисленных ниже:

101 должен вернуть 111 (длина 3 бита) 011 должен вернуть 11 (длина 2 бита) 11100 должен быть возвращен 11111 (5 бит) 101010101 должен вернуть 111111111 (длина 9 бит)

Как это можно получить самым простым способом в Java? Я мог бы придумать некоторые методы, но они не очень "симпатичны".

Ответы [ 4 ]

11 голосов
/ 23 мая 2010

Моя попытка: Integer.highestOneBit(b) * 2 - 1

6 голосов
/ 23 мая 2010

Вы можете использовать этот код:

int setBits (int value)
{
    value |= (value >> 1);
    value |= (value >> 2);
    value |= (value >> 4);
    value |= (value >> 8);
    value |= (value >> 16);
    return value;
}

Идея состоит в том, что крайний левый 1 будет скопирован во все позиции справа.

РЕДАКТИРОВАТЬ: также отлично работает с отрицательным value. Если вы замените int на long, добавьте еще один |= оператор: value |= (value >> 32). Как правило, последний сдвиг должен иметь степень 2, равную по крайней мере половине размера value в битах.

6 голосов
/ 23 мая 2010

Не проверял, но что-то вроде этого должно быть в порядке:

long setBits(long number) {
  long n = 1;
  while (n <= number) n <<= 1;
  return n - 1;
}
0 голосов
/ 23 мая 2010

Не самый эффективный, но самый простой,

    int i = (1 << (int)(Math.log(n)/Math.log(2)+1)) - 1;

Это будет работать для первых 31 битов int и первых 63 битов для long.

...