获取int中使用的位长度

sig*_*sen 8 java binary int bit-manipulation

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

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

如何在Java中获得最简单的方法?我可以想出一些方法,但它们不是很"漂亮".

hle*_*one 11

我的尝试: Integer.highestOneBit(b) * 2 - 1

  • 哇,不知道Java有这个功能......这绝对是最重要的. (3认同)

Ama*_*dan 6

没有测试过,但这样的事情应该没问题:

long setBits(long number) {
  long n = 1;
  while (n <= number) n <<= 1;
  return n - 1;
}
Run Code Online (Sandbox Code Playgroud)


dou*_*lep 6

你可以使用这段代码:

int setBits (int value)
{
    value |= (value >> 1);
    value |= (value >> 2);
    value |= (value >> 4);
    value |= (value >> 8);
    value |= (value >> 16);
    return value;
}
Run Code Online (Sandbox Code Playgroud)

这个想法是最左边的1将被复制到右边的所有位置.

编辑:也适用于负面value.如果替换intlong,请添加一个额外的|=声明:value |= (value >> 32).通常,最后一次移位必须是2的幂,其至少value是位大小的一半.

  • 该算法特别好的是它重用了先前的操作.天真的我只做了32班. (2认同)