使用java.math.BigInteger.bitCount()查找整数二进制表示法的1的数字

时间:2012-01-17 01:58:47

标签: java binary

我有一个赋值,我需要创建一个函数,告诉你一个整数的二进制表示法中有多少个1。我已经通过创建自己的算法做到了这一点。第二步是使用java.math.BigInteger.bitCount()来完成同样的事情。我在Java API中查了一下,但是有人可以把它放到英文中并解释它与在整数的二进制表示法中找到1的数量有关,也许也是一个例子。我尝试使用谷歌搜索,但只发现以下定义。

public int bitCount()

描述: 返回此数字的二进制补码表示中与其符号位不同的位数。在BigIntegers上实现位向量样式集时,此方法很有用。

5 个答案:

答案 0 :(得分:4)

在负整数的two's complement表示中,符号位为1,而在非负整数的表示中,符号位为0。因此,对于正整数,bitCount()返回 0的位数,即 1。< / p>

答案 1 :(得分:1)

再次读取javadoc,然后假设一个正数 - 这意味着符号位将为零。

一旦你理解了这一点,就要考虑在否定的情况下做些什么。

答案 2 :(得分:0)

有符号整数的最高位是符号位。如果数字是> = 0,那么符号位是0.如果数字是&lt; 0然后符号位为1.

因此该函数为您提供与符号位不同的位数。使积极数字的工作变得非常容易。负数的答案还取决于用于表示数字的总位数。

答案 3 :(得分:0)

为什么不使用Integer的{​​{1}}(不是bitCount)?无论符号如何,它都会返回1位数。

答案 4 :(得分:0)

jcomeau@intrepid:/tmp$ cat test.java; javac test.java; java test
import java.math.BigInteger;
public class test {
 public static void main(String[] args) {
  System.out.println("one bits: " + new BigInteger("0f0f0f0f0f0f0", 16).bitCount());
 }
}
one bits: 24

新评论的修改代码:

jcomeau@intrepid:/tmp$ cat test.java; javac test.java; java test 0xf0f0f0f0f0f0 0x200 200 1 0
import java.math.BigInteger;
public class test {
 public static void main(String[] args) {
  BigInteger number = null;
  for (String arg : args) {
   if (arg.startsWith("0x")) {
    number = new BigInteger(arg.substring(2), 16);
   } else {
    number = new BigInteger(arg);  // decimal by default
   }
   System.out.println("one bits in " + arg + ": " + number.bitCount());
  }
 }
}
one bits in 0xf0f0f0f0f0f0: 24
one bits in 0x200: 1
one bits in 200: 3
one bits in 1: 1
one bits in 0: 0

显然,通过阅读您发布的javadoc,这可能会也可能不符合您或您的教授对负数的期望。例如,这将为负1返回0“1”位,因为所有位都与符号位相同。但它应该适用于所有积极的价值观。