mythic
mythic

Reputation: 935

Comparing two char arrays each representing a binary number

I need to write a method for comparing two binary numbers. I am storing the binary numbers in character arrays, so I can store big numbers (I can't use the BigInteger class or any other packages).

Example to make things clear:

char[] num1 = {'1','1','0'}
char[] num2 = {'1','1','1'}

I need to return 0 if they are equal, -1 if a < b and 1 if a > b

This is the approach I took:

 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;
}

So as far as I understand, this works in every case, but the case where the number of bits are equal (1100 is bigger than 1001 for example).

I was thinking I could add up the indexes in the for loop for each array and work from there, but I started thinking I may be overcomplicating things. Is this even a good approach to it? I'm starting to doubt it. Any insight is appreciated

Upvotes: 1

Views: 4561

Answers (3)

Mario Galea
Mario Galea

Reputation: 94

An alternative approach would be as follows:

  1. Convert Array Of Characters into String.
  2. Convert the resulting String into int.
  3. Work out the logic from the resulting int

It will always work and you can print out the resulting conversion.

Hope this helps.

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.
}

Upvotes: 0

Matteo Di Napoli
Matteo Di Napoli

Reputation: 577

Using some conversion and the binary parseInt offered by class Integer you can do this simple comparison regardless of the arrays' size. (I'd be careful instead with checking the length of the arrays because if you have leading zeros in one array this could bring some comparisons to miss).

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;

Upvotes: 0

Darren Clark
Darren Clark

Reputation: 803

I would look for the first index that is 1 in one of the numbers but 0 in the other number. You can replace the bit counting loop(keeping the length check) with:

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;

Upvotes: 2

Related Questions