【问题标题】:finding the number of 1's in binary notation of integer using java.math.BigInteger.bitCount()使用 java.math.BigInteger.bitCount() 以整数的二进制表示法查找 1 的数量
【发布时间】:2012-01-18 08:18:57
【问题描述】:

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

public int bitCount()

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

【问题讨论】:

    标签: java binary


    【解决方案1】:

    在负整数的two's complement 表示中,符号位是1,而在非负整数的表示中,符号位是0。因此,对于一个正整数,bitCount() 返回 不是 0 的位数,即 1

    【讨论】:

      【解决方案2】:

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

      一旦你理解了这一点,想想在消极情况下该怎么做。

      【讨论】:

        【解决方案3】:
        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”位,因为所有位都与符号位相同。但它应该适用于所有正值。

        【讨论】:

        • 这通常有效,但是当我尝试获取以 0 结尾的整数(例如 10 或 200)的一位时,它总是给我答案,就好像它只是第一个数字一样,例如200 的一位等于 2 的一位数。你知道为什么会这样吗?
        • 200 hex 只有一位,还是你的意思是 200 十进制?如果您像我在上面的代码示例中那样使用 16 的基数,那么您输入的数字是十六进制。
        • 谢谢!是的,我错误地使用了 16 的基数。这就是导致问题的原因。
        【解决方案4】:

        有符号整数的最高有效位是符号位。如果数字 >= 0,则符号位为 0。如果数字

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

        【讨论】:

          【解决方案5】:

          为什么不直接使用IntegerbitCount(而不是BigInteger)?它返回 1 的位数,与符号无关。

          【讨论】:

            猜你喜欢
            • 2018-09-15
            • 2011-12-18
            • 2012-02-10
            • 1970-01-01
            • 2010-10-15
            • 2018-08-03
            • 1970-01-01
            • 2019-06-01
            • 2018-07-31
            相关资源
            最近更新 更多