Thursday, 29 June 2017

Cracking the Coding Interview Hard Problem (add function without use of '+') - First Attempt


public class Adder 
{

/*
Ci  a  b    o    c
0   0  0    0    0
0   0  1    1    0
0   1  0    1    0
0   1  1    0    1
1   0  0    1    0
1   0  1    0    1
1   1  0    0    1
1   1  1 1    1
*/

// 4 bit adder
static public int add(int a, int b) {
int [] output_logic  = {0,2,2,1,2,1,1,3} ;
int mask = 1 ;
int result = 0;
int carry_in = 0;
int carry_out ;
int output ;
int input_logic_index ;
int abit ;
int bbit ;
int bit_result ;
// 1 bit adder
abit = (1 & a) ;
bbit = (1 & b) ;

input_logic_index = (carry_in << 2) | (abit << 1) | (bbit << 0) ;

output = output_logic[input_logic_index] ;
carry_out = (output & 1) ;
bit_result = ((output & 2) >> 1) ;
carry_in = carry_out ;
result|=(bit_result<<0) ;
a>>>=1 ; b>>>=1 ;

// 1 bit adder
abit = (1 & a) ;
bbit = (1 & b) ;

input_logic_index = (carry_in << 2) | (abit << 1) | (bbit << 0) ;

output = output_logic[input_logic_index] ;
carry_out = (output & 1) ;
bit_result = ((output & 2) >> 1) ;
carry_in = carry_out ;
result|=(bit_result<<1) ;
a>>>=1 ; b>>>=1 ;

// 1 bit adder
abit = (1 & a) ;
bbit = (1 & b) ;

input_logic_index = (carry_in << 2) | (abit << 1) | (bbit << 0) ;

output = output_logic[input_logic_index] ;
carry_out = (output & 1) ;
bit_result = ((output & 2) >> 1) ;
carry_in = carry_out ;
result|=(bit_result<<2) ;
a>>>=1 ; b>>>=1 ;

// 1 bit adder
abit = (1 & a) ;
bbit = (1 & b) ;

input_logic_index = (carry_in << 2) | (abit << 1) | (bbit << 0) ;

output = output_logic[input_logic_index] ;
carry_out = (output & 1) ;
bit_result = ((output & 2) >> 1) ;
carry_in = carry_out ;
result|=(bit_result<<3) ;
a>>>=1 ; b>>>=1 ;

// 1 bit adder
abit = (1 & a) ;
bbit = (1 & b) ;

input_logic_index = (carry_in << 2) | (abit << 1) | (bbit << 0) ;

output = output_logic[input_logic_index] ;
carry_out = (output & 1) ;
bit_result = ((output & 2) >> 1) ;
carry_in = carry_out ;
result|=(bit_result<<4) ;
a>>>=1 ; b>>>=1 ;

return result  ; //| carry_out;
}

static public void main(String [] args) {
int failed = 0 ;
for (int i = 0 ; i < 15 ; i++ ) {
for (int j = 0 ; j < 15 ; j++) {
int fullResult = add(i,j) ;
int compare = i + j ;
if (compare != fullResult) {
System.out.println(" i, j " + i + "," + j + " full result = " + fullResult + "<->" + compare + "failed") ;
failed++ ;
}
}
}
System.out.println("Failure count " + failed ) ;
return ;
}
}

No comments:

Post a Comment