获取int中使用的位长度

时间:2010-05-23 13:39:59

标签: java binary int bit-manipulation

如果你有二进制数10110,我怎么能让它返回11111?例如,在第一个1之后将所有位设置为1的新二进制数,下面列出了一些类似的例子:

101应该返回111(3位长度) 011应该返回11(2位长度) 11100应返回11111(5位长) 101010101应返回111111111(9位长度)

如何以最简单的方式获得Java?我可以提出一些方法,但它们不是很“漂亮”。

4 个答案:

答案 0 :(得分:11)

答案 1 :(得分:6)

尚未测试,但这样的事情应该没问题:

long setBits(long number) {
  long n = 1;
  while (n <= number) n <<= 1;
  return n - 1;
}

答案 2 :(得分:6)

您可以使用此代码:

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大小的一半。

答案 3 :(得分:0)

效率最高,但最简单,

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

它将适用于int的前31位和前63位。