package com.interview.bits;
/**
* http://www.geeksforgeeks.org/add-two-bit-strings/
* http://www.geeksforgeeks.org/binary-representation-of-a-given-number/
* http://www.geeksforgeeks.org/add-two-numbers-without-using-arithmetic-operators/
*/
public class AddTwoNumberInBinaryRepresentation {
public int add(char[] num1,char[] num2){
int index1 = num1.length -1;
int index2 = num2.length -1;
int carry = 0;
int result = 0;
int index = 0;
while(index1 >= 0 && index2 >= 0){
int r1 = num1[index1] - '0';
int r2 = num2[index2] - '0';
result = result | (r1^r2^carry)<<index;
index1--;
index2--;
index++;
carry = r1 & carry | r2 & carry | r1 & r2;
}
while(index1 >= 0){
int r1 = num1[index1] - '0';
result = result | (r1^carry)<<index;
index1--;
index++;
carry = r1 & carry;
}
while(index2 >= 0){
int r2 = num1[index2] - '0';
result = result | (r2^carry)<<index;
index2--;
index++;
carry = r2 & carry;
}
return result;
}
public int addTwoNumbersWithoutArithmeticOperator(int num1,int num2){
int carry = 0;
int result = 0;
for(int i=0; i <=31; i++){
int r1 = (num1 & 1<<i) != 0 ? 1 : 0;
int r2 = (num2 & 1<<i) !=0 ? 1 : 0;
result = result | (r1^r2^carry)<<i;
if((r1 & r2) != 0 || (r1 & carry) != 0 || (r2 & carry) != 0){
carry = 1;
}else{
carry = 0;
}
}
return result;
}
public int addTwoNumbersWithoutArithmeticOperatorFaster(int num1,int num2){
while(num2 != 0){
int carry = num1 & num2;
num1 = num1 ^ num2;
num2 = carry << 1;
}
return num1;
}
public void printResult(int num){
for(int i= 1<<31; i !=0 ; i = i>>>1){
if((num & i) > 0){
System.out.print("1");
}else{
System.out.print("0");
}
}
}
public static void main(String args[]){
AddTwoNumberInBinaryRepresentation anp = new AddTwoNumberInBinaryRepresentation();
char num1[] = "1010001110".toCharArray();
char num2[] = "10011".toCharArray();
int result = anp.add(num1, num2);
System.out.println(anp.addTwoNumbersWithoutArithmeticOperator(296, 5662));
System.out.println(anp.addTwoNumbersWithoutArithmeticOperatorFaster(296, 5662));
anp.printResult(result);
}
}