获取 int 中使用的位长度

发布于 2024-09-02 19:11:22 字数 226 浏览 10 评论 0原文

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

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

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

If you have the binary number 10110 how can I get it to return 11111? e.g a new binary number that sets all bits to 1 after the first 1, there are some likewise examples listed below:

101 should return 111 (3 bit length)
011 should return 11 (2 bit length)
11100 should be return 11111 (5 bit length)
101010101 should return 111111111 (9 bit length)

How can this be obtained the easiest way in Java? I could come up with some methods but they are not very "pretty".

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

独守阴晴ぅ圆缺 2024-09-09 19:11:22

您可以使用以下代码:

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

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

编辑:对于负值也可以正常工作。如果将 int 替换为 long,请添加一个额外的 |= 语句:value |= (value >>> 32)< /代码>。一般来说,最后一次移位必须是 2 的幂,至少是大小(以位为单位)的一半。

You could use this code:

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

The idea is that leftmost 1 will get copied to all positions on the right.

EDIT: Also works fine with a negative value. If you replace int with long, add one extra |= statement: value |= (value >> 32). In general, last shift must be a power of 2 that is at least half of value size in bits.

小红帽 2024-09-09 19:11:22

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

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

Haven't tested, but something like this should be okay:

long setBits(long number) {
  long n = 1;
  while (n <= number) n <<= 1;
  return n - 1;
}
ゃ人海孤独症 2024-09-09 19:11:22

不是最有效,但最简单,

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

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

Not most efficient, but simplest,

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

It will work for first 31 bit of int and first 63 bit for long.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文