如果你有二进制数10110,我怎么能让它返回11111?例如,在第一个1之后将所有位设置为1的新二进制数,下面列出了一些类似的例子:
101应该返回111(3位长度) 011应该返回11(2位长度) 11100应返回11111(5位长) 101010101应返回111111111(9位长度)
如何以最简单的方式获得Java?我可以提出一些方法,但它们不是很“漂亮”。
答案 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位。