查找1'的数目;使用java.math.biginger.bitCount()的整数二进制表示法

查找1'的数目;使用java.math.biginger.bitCount()的整数二进制表示法,java,binary,Java,Binary,我有一个赋值,我需要创建一个函数,告诉你一个整数的二进制表示法中有多少个1。我已经通过创建自己的算法做到了这一点。第二步是使用java.math.biginger.bitCount()完成同样的任务。我在JavaAPI中找到了这个,但是有人能把它翻译成英语,并解释它与在整数的二进制表示法中查找1的数量有什么关系,也许还有一个例子。我试着在谷歌上搜索,但只找到了下面的定义 公共整数位计数() 说明: 返回此数字的两个补码表示形式中与其符号位不同的位数。当在大整数上实现位向量样式集时,此方法非常有用

我有一个赋值,我需要创建一个函数,告诉你一个整数的二进制表示法中有多少个1。我已经通过创建自己的算法做到了这一点。第二步是使用
java.math.biginger.bitCount()
完成同样的任务。我在JavaAPI中找到了这个,但是有人能把它翻译成英语,并解释它与在整数的二进制表示法中查找1的数量有什么关系,也许还有一个例子。我试着在谷歌上搜索,但只找到了下面的定义

公共整数位计数()

说明:
返回此数字的两个补码表示形式中与其符号位不同的位数。当在大整数上实现位向量样式集时,此方法非常有用

在负整数的表示中,符号位是
1
,而在非负整数的表示中,符号位是
0
。因此,对于正整数,
bitCount()
返回非
0
的位数,即
1
在负整数的表示中,符号位是
1
,而在非负整数的表示中,符号位是
0
。因此,对于正整数,
bitCount()
返回非
0
的位数,即
1
再次读取javadoc,然后假设一个正数——这意味着符号位将为零


一旦你明白了这一点,想想在否定的情况下该怎么做。

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


一旦你明白了这一点,想想在负数情况下该怎么办。

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


因此,函数给出了与符号位不同的位数。对于正数来说,这项工作非常容易。负数的答案还取决于用于表示该数字的位的总数。

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


因此,函数给出了与符号位不同的位数。对于正数来说,这项工作非常容易。负数的答案也将取决于用于表示该数字的位的总数。

为什么不直接使用
整数
位计数
(而不是
大整数
)?它返回1位的数字,不考虑符号。

为什么不直接使用
Integer
bitCount
(而不是
biginger
)?它返回1位的数字,不考虑符号

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”位,因为所有位都与符号位相同。但它应该适用于所有积极的价值观

新注释的修改代码:

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结尾的整数的1位时,例如10或200,它总是给出答案,好像它只是第一个数字,例如,200的1位等于2的1位数。你知道为什么吗?200十六进制只有一位,还是说200十进制?如果您像我在上面的代码示例中那样使用基数16,那么您输入的数字是十六进制。谢谢!是的,我错误地使用了基数16。这就是导致问题的原因。这通常是有效的,但是当我尝试获取以0结尾的整数的1位时,例如10或200,它总是给我答案,好像它只是第一个数字,例如,200的1位等于2的1位数。你知道为什么吗?200十六进制只有一位,还是说200十进制?如果您像我在上面的代码示例中那样使用基数16,那么您输入的数字是十六进制。谢谢!是的,我错误地使用了基数16。这就是造成问题的原因。