2016-02-24 64 views
0

尝试在二进制数中找到1's(置位)的编号。而我能够得到的结果更小的数字,但是当数字变大,它崩溃,这里是代码:bitCount导致错误,可能的修复?

public class time { 

    public static void main(String[] args) 
    { 
     String a = "1001101111101011011100101100100110111011111011000100111100111110111101011011011100111001100011111010"; 
     int x = Integer.bitCount(Integer.parseInt(a, 2)); 
     System.out.println(x); 

    } 


} 

a是100位二进制数的字符串表示现在时我试图让bitCount(),编译器说:

异常线程 “main” java.lang.NumberFormatException:对于输入字符串 “1001101111101011011100101100100110111011111011000100111100111110111101011011011100111001100011111010”

所以我的的问题是:这样的大数可能的修复程序有什么可以解决的?

注意:我还需要对500位数字进行相同的操作!

回答

2

您可以使用BigInteger

public static void main(String[] args) { 
    String a = "1001101111101011011100101100100110111011111011000100111100111110111101011011011100111001100011111010"; 
    int x = new BigInteger(a, 2).bitCount(); 
    System.out.println(x); 
} 

这就造成在基地2(new BigInteger(val, radix))输入字符串变成Biginteger并返回其位计数(bitCount())。

此方法适用于任何长度的字符串(最大为Integer.MAX_VALUE),所以它也适用于小字符串,但它不会像使用基本解法那样具有高性能。


正如this answer指出Sleiman Jneidi,如果你真的只在一点兴趣算那么既然你已经有了二进制表示为String,那么你其实并不需要把它转换成一个数字,您可以只计算String中1的个数。使用Java 8的示例实现将是:

long x = a.chars().filter(c -> c == '1').count(); 
+0

谢谢,这是这样做的最好方法?作为另一个答案指向我通过迭代手动计数?你怎么看? – OBX

+1

如果你只对位数感兴趣而没有别的,其他的答案会简单得多。 – Tunaki

+0

我需要对这些数据执行一个'OR'操作,比如说两个100位数字,只有这样我才需要count(),并且用BigInteger代码,我会遇到麻烦,任何帮助都将非常感谢,谢谢。再次为精彩的答案! – OBX

2

您拥有的位串不符合32位整数,因此您会收到错误。

你不需要转换为整数来获得位数,你可以迭代并计算字符串中1的个数。

+0

谢谢,但我需要在另一个长度上执行“OR”操作?在这种情况下最好的解决方案? – OBX

+0

@shaheen你可以直接在位串上做 –

0

是的,你正在尝试存储一个超出int范围的值。事实上,远远超出范围,BigInteger是解决这个问题的唯一方法,因为即使是“long”也不能拥有如此大的价值。这是一个常见的问题,确保在处理在java中存储大数值时要小心(或可能性)。这里有一个快速审查:

http://www.tutorialspoint.com/java/java_basic_datatypes.htm