【问题标题】:Get length of bits used in int获取 int 中使用的位长度
【发布时间】:2011-02-22 22:20:25
【问题描述】:

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

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

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

【问题讨论】:

标签: java binary int bit-manipulation


【解决方案1】:

【讨论】:

【解决方案2】:

您可以使用以下代码:

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 大小的一半(以位为单位)。

【讨论】:

  • 该算法特别好的地方在于它重用了先前的操作。天真地我只做了 32 个班次。
  • 如果您查看 JDK 中 Integer#highestOneBit() 的实现,您会看到相同的算法,尽管最后一步是量身定制的,只提供一位,需要在 hleinone 的答案中捕获撤消。
【解决方案3】:

还没有测试过,但是这样的应该没问题:

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

【讨论】:

  • 如果number 为负数,这将不起作用。如果number 通常很小,它会很快,但如果number 在其范围内大致均匀分布,则会很慢。
  • 关于底片是真的,我没有考虑过。如果我从另一端开始,平均起来会更快。但是 63 次迭代(最大)并没有那么慢。答案在我脑海中。显然,hleinone 的解决方案将其从水中吹出来...... :)
【解决方案4】:

不是最有效,但最简单,

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

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

【讨论】:

    猜你喜欢
    • 2012-06-24
    • 1970-01-01
    • 1970-01-01
    • 2014-05-18
    • 1970-01-01
    • 2013-05-11
    • 1970-01-01
    • 1970-01-01
    • 2010-11-21
    相关资源
    最近更新 更多