Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 获取int中使用的位的长度_Java_Binary_Int_Bit Manipulation - Fatal编程技术网

Java 获取int中使用的位的长度

Java 获取int中使用的位的长度,java,binary,int,bit-manipulation,Java,Binary,Int,Bit Manipulation,如果你有二进制数10110,我怎样才能让它返回11111?e、 g一个新的二进制数,将第一个1后的所有位设置为1,下面列出了一些类似的示例: 101应返回111(3位长度) 011应返回11(2位长度) 11100应返回11111(5位长度) 101010101应返回111111111(9位长度) 在Java中如何以最简单的方式实现这一点?我可以想出一些方法,但它们不是很“漂亮”。还没有测试过,但类似这样的方法应该可以: long setBits(long number) { long n

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

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


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

还没有测试过,但类似这样的方法应该可以:

long setBits(long number) {
  long n = 1;
  while (n <= number) n <<= 1;
  return n - 1;
}
长挫折(长数字){
长n=1;

而(n您可以使用以下代码:

int setBits (int value)
{
    value |= (value >> 1);
    value |= (value >> 2);
    value |= (value >> 4);
    value |= (value >> 8);
    value |= (value >> 16);
    return value;
}
其思想是最左边的1将被复制到右边的所有位置


编辑:对于负的
值也可以使用。如果用
long
替换
int
,则添加一个额外的
|=
语句:
值|=(值>>32)
。通常,最后一次移位必须是2的幂,至少是
大小的一半。

不是最有效的,但最简单

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

int i=(1我的尝试:

全部都在这里:该算法特别好的地方在于它重用了先前的操作。天真地说,我只需要做32个移位。如果你看看
Integer#highestOneBit()的实现
在JDK中,您将看到相同的算法,尽管最后一步是定制的,只提供单个一位,需要hleinone的答案中捕获的撤消。如果
number
为负数,这将不起作用。如果
number
通常很小,它会很快,但是如果
number
在其范围内均匀分布,它会很慢e、 关于否定,我没有想到。如果我从另一端开始,平均速度会更快。但是63次迭代(最多)并不是那么慢;答案是我想不出来的。显然,赫莱诺内的解决方案把它从水里吹了出来……)完整性:嗯…看起来我不能发布链接。所以不喜欢括号。哇,我不知道Java有这个功能…这绝对是最重要的。