Вы можете использовать этот код:
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
в битах.