我需要编写一个比较两个二进制数的方法。我将二进制数存储在字符数组中,因此我可以存储大数字(我不能使用BigInteger类或任何其他包)。
说明事项的例子:
char[] num1 = {'1','1','0'}
char[] num2 = {'1','1','1'}
如果它们相等,我需要返回0,如果是<则需要返回-1。 b和1如果a> B'/ P>
这是我采取的方法:
static int compare(char[]a, char[]b) {
//If arrays lengths aren't equal I already know, one is bigger then the other
int a_len = a.length;
int b_len = b.length;
int a_bits = 0;
int b_bits = 0;
if (a_len > b_len)
return 1;
if (b_len > a_len)
return -1;
//I count the number of bits that are 1 in both arrays
for (int i = 0; i < a.length; i++) {
if (a[i] == '1') a_bits++;
if (b[i] == '1') b_bits++;
}
if(a_bits>b_bits)
return 1;
if(b_bits>a_bits)
return -1;
return 0;
}
据我了解,这适用于所有情况,但位数相等的情况(例如1100大于1001)。
我以为我可以在每个数组的for循环中添加索引并从那里开始工作,但我开始认为我可能会过度复杂化。这甚至是一个很好的方法吗?我开始怀疑它。任何见解都表示赞赏
答案 0 :(得分:1)
我会寻找第一个索引,其中一个数字为1,而另一个数字为0。您可以使用以下命令替换位计数循环(保持长度检查):
for (int i = 0; i < a.length; i++) {
if (a[i] == '1' && b[i] == '0') return 1;
if (b[i] == '1' && a[i] == '0') return -1;
}
return 0;
答案 1 :(得分:0)
使用一些转换和类Integer提供的二进制parseInt,无论数组的大小如何,都可以进行简单的比较。 (我要小心检查数组的长度,因为如果你在一个数组中有前导零,这可能会导致一些比较错过。)
String first = new String(a);
String second = new String(b);
int firstint = Integer.parseInt(first, 2);
int secondint = Integer.parseInt(second, 2);
if(firstint > secondint)
return 1;
if(firstint < secondint)
return -1;
return 0;
答案 2 :(得分:0)
另一种方法如下:
它始终有效,您可以打印出最终的转换。
希望这有帮助。
public static void main(String[] args) {
char[] num1 = {'1','1','0'};
char[] num2 = {'1','1','1'};
System.out.println(compare(num1, num2));
}
public static int compare(char[]num1, char[]num2) {
// Convert Array of Characters to String
String one = String.valueOf(num1);
String two = String.valueOf(num2);
// Convert to Integer (Binary to Decimal Conversion to base2)
int a = Integer.parseInt(one,2);
int b = Integer.parseInt(two,2);
int result = 0; // return result as equals i.e. 0.
if(a > b) { // Yes. Curly brackets are important in Java
result = 1;
} else if(a < b){
result = -1;
}
return result; // Use only one return, i.e. a variable.
}