可能重复:
Best algorithm to count the number of set bits in a 32-bit integer?
我想知道一个数字的二进制表示中有多少1个。我有2个逻辑。
int count =0;
int no = 4;
while(no!=0){
int d = no%2;
if(d==1)
count++;
no = no/2;
str = str+ d;
}
现在第二个逻辑是继续使用1,2,4,8,32继续屏蔽数字并检查结果是否为1,2,4,8 ...我不知道应该结束什么这个循环的条件。
答案 0 :(得分:31)
答案 1 :(得分:16)
比任何早期的答案都快: (与1位数而不是总位数成比例)
public class Foo {
public static void main(String[] argv) throws Exception {
int no = 12345;
int count;
for (count = 0; no > 0; ++count) {
no &= no - 1;
}
System.out.println(count);
}
}
答案 2 :(得分:3)
看起来像c / c ++ / c#,如果是这样的话你已经转移..只需从0循环到N-1位并使用sum+=(value>>i)&1
即:你总是检查最后/最右边的位,但是每次迭代都会将数字的二进制表示移到右边,直到你没有更多的位来检查。
另外,考虑签名/无符号和任何整数格式。但是你没有说明在问题中应该如何处理。
答案 3 :(得分:2)
通常用于计算一个想法的一个想法是构建一个包含每个字节的答案的查找表,然后将您的数字拆分为四个字节并将总数加起来。这需要四次查找并且非常快。您可以通过编写手动计算答案的程序(可能使用上面的程序)来构建此表,然后可以编写如下函数:
private static final int[] BYTE_TOTALS = /* ... generate this ... */;
public static int countOneBits(int value) {
return BYTE_TOTALS[value & 0xFF] +
BYTE_TOTALS[value >>> 8 & 0xFF] +
BYTE_TOTALS[value >>> 16 & 0xFF] +
BYTE_TOTALS[value >>> 24 & 0xFF];
}
希望这有帮助!
答案 4 :(得分:1)
我们可以为你的循环使用溢出:
int count = 0;
int number = 37;
int mask = 1;
while(mask!=0)
{
int d = number & mask;
if(d != 0)
count++;
/* Double mask until we overflow, which will result in mask = 0... */
mask = mask << 1;
str = str+ d;
}
答案 5 :(得分:1)
有很多方法可以非常快速地完成这项工作。
int no =1234;
int tmp =0;
tmp = no - ((no >> 1) & 033333333333) - ((no >> 2) & 011111111111);
System.out.println( ((tmp + (tmp >> 3)) & 030707070707) % 63);
答案 6 :(得分:0)
你的最终状况应该是跟踪你所处的位数;如果它大于你完成的原始数字(从现在开始只会得到0)。
哦,既然你没有指定语言,这里有一个Ruby解决方案:)
class Integer
def count_binary_ones
to_s(2).scan('1').length
end
end
42.count_binary_ones #=> 3
答案 7 :(得分:0)
如何使用BigInteger类。
public void function(int checkedNumber) {
BigInteger val = new BigInteger(String.valueOf(checkedNumber));
val = val.abs();
int count = val.bitCount();
String binaryString = val.toString(2);
System.out.println("count = " + count);
System.out.println("bin = " + binaryString);
}
功能结果(42);正在跟随。
count = 3
bin = 101010