BAEL-3027 binary number arithmetic operations (#7437)
* BAEL-3027 binary number arithmetic operations * BAEL-3127 updated the unit test case names * added unit test cases for built-in java functions * updated function name * BAEL-3127 updated unit test case names * BAEL-3127 removed comments from code
This commit is contained in:
		
							parent
							
								
									db90a53e38
								
							
						
					
					
						commit
						ecf8bd76cc
					
				| @ -0,0 +1,148 @@ | ||||
| package com.baeldung.binarynumbers; | ||||
| 
 | ||||
| public class BinaryNumbers { | ||||
| 
 | ||||
|     /** | ||||
|      * This method takes a decimal number and convert it into a binary number. | ||||
|      * example:- input:10, output:1010 | ||||
|      * | ||||
|      * @param decimalNumber | ||||
|      * @return binary number | ||||
|      */ | ||||
|     public Integer convertDecimalToBinary(Integer decimalNumber) { | ||||
| 
 | ||||
|         if (decimalNumber == 0) { | ||||
|             return decimalNumber; | ||||
|         } | ||||
| 
 | ||||
|         StringBuilder binaryNumber = new StringBuilder(); | ||||
| 
 | ||||
|         while (decimalNumber > 0) { | ||||
| 
 | ||||
|             int remainder = decimalNumber % 2; | ||||
|             int result = decimalNumber / 2; | ||||
| 
 | ||||
|             binaryNumber.append(remainder); | ||||
|             decimalNumber = result; | ||||
|         } | ||||
| 
 | ||||
|         binaryNumber = binaryNumber.reverse(); | ||||
| 
 | ||||
|         return Integer.valueOf(binaryNumber.toString()); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * This method takes a binary number and convert it into a decimal number. | ||||
|      * example:- input:101, output:5 | ||||
|      * | ||||
|      * @param binary number | ||||
|      * @return decimal Number | ||||
|      */ | ||||
|     public Integer convertBinaryToDecimal(Integer binaryNumber) { | ||||
| 
 | ||||
|         Integer result = 0; | ||||
|         Integer base = 1; | ||||
| 
 | ||||
|         while (binaryNumber > 0) { | ||||
| 
 | ||||
|             int lastDigit = binaryNumber % 10; | ||||
|             binaryNumber = binaryNumber / 10; | ||||
| 
 | ||||
|             result += lastDigit * base; | ||||
| 
 | ||||
|             base = base * 2; | ||||
|         } | ||||
|         return result; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * This method accepts two binary numbers and returns sum of input numbers. | ||||
|      * Example:- firstNum: 101, secondNum: 100, output: 1001 | ||||
|      * | ||||
|      * @param firstNum | ||||
|      * @param secondNum | ||||
|      * @return addition of input numbers | ||||
|      */ | ||||
|     public Integer addBinaryNumber(Integer firstNum, Integer secondNum) { | ||||
| 
 | ||||
|         StringBuilder output = new StringBuilder(); | ||||
| 
 | ||||
|         int carry = 0; | ||||
|         int temp; | ||||
| 
 | ||||
|         while (firstNum != 0 || secondNum != 0) { | ||||
| 
 | ||||
|             temp = (firstNum % 10 + secondNum % 10 + carry) % 2; | ||||
|             output.append(temp); | ||||
| 
 | ||||
|             carry = (firstNum % 10 + secondNum % 10 + carry) / 2; | ||||
| 
 | ||||
|             firstNum = firstNum / 10; | ||||
|             secondNum = secondNum / 10; | ||||
|         } | ||||
| 
 | ||||
|         if (carry != 0) { | ||||
|             output.append(carry); | ||||
|         } | ||||
| 
 | ||||
|         return Integer.valueOf(output.reverse() | ||||
|             .toString()); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|     * This method takes two binary number as input and subtract second number from the first number. | ||||
|     * example:- firstNum: 1000, secondNum: 11, output: 101 | ||||
|     * @param firstNum | ||||
|     * @param secondNum | ||||
|     * @return Result of subtraction of secondNum from first | ||||
|     */ | ||||
|     public Integer substractBinaryNumber(Integer firstNum, Integer secondNum) { | ||||
| 
 | ||||
|         int onesComplement = Integer.valueOf(getOnesComplement(secondNum)); | ||||
| 
 | ||||
|         StringBuilder output = new StringBuilder(); | ||||
| 
 | ||||
|         int carry = 0; | ||||
|         int temp; | ||||
| 
 | ||||
|         while (firstNum != 0 || onesComplement != 0) { | ||||
| 
 | ||||
|             temp = (firstNum % 10 + onesComplement % 10 + carry) % 2; | ||||
|             output.append(temp); | ||||
| 
 | ||||
|             carry = (firstNum % 10 + onesComplement % 10 + carry) / 2; | ||||
| 
 | ||||
|             firstNum = firstNum / 10; | ||||
|             onesComplement = onesComplement / 10; | ||||
|         } | ||||
| 
 | ||||
|         String additionOfFirstNumAndOnesComplement = output.reverse() | ||||
|             .toString(); | ||||
| 
 | ||||
|         if (carry == 1) { | ||||
|             return addBinaryNumber(Integer.valueOf(additionOfFirstNumAndOnesComplement), carry); | ||||
|         } else { | ||||
|             return getOnesComplement(Integer.valueOf(additionOfFirstNumAndOnesComplement)); | ||||
|         } | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|     public Integer getOnesComplement(Integer num) { | ||||
| 
 | ||||
|         StringBuilder onesComplement = new StringBuilder(); | ||||
| 
 | ||||
|         while (num > 0) { | ||||
|             int lastDigit = num % 10; | ||||
|             if (lastDigit == 0) { | ||||
|                 onesComplement.append(1); | ||||
|             } else { | ||||
|                 onesComplement.append(0); | ||||
|             } | ||||
|             num = num / 10; | ||||
|         } | ||||
| 
 | ||||
|         return Integer.valueOf(onesComplement.reverse() | ||||
|             .toString()); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -0,0 +1,73 @@ | ||||
| package com.baeldung.binarynumbers; | ||||
| 
 | ||||
| import static org.junit.Assert.assertEquals; | ||||
| 
 | ||||
| import org.junit.Test; | ||||
| 
 | ||||
| public class BinaryNumbersUnitTest { | ||||
| 
 | ||||
|     private BinaryNumbers binaryNumbers = new BinaryNumbers(); | ||||
| 
 | ||||
|     @Test | ||||
|     public void given_decimalNumber_then_returnBinaryNumber() { | ||||
|         assertEquals(Integer.valueOf(1000), binaryNumbers.convertDecimalToBinary(8)); | ||||
|         assertEquals(Integer.valueOf(10100), binaryNumbers.convertDecimalToBinary(20)); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void given_decimalNumber_then_convertToBinaryNumber() { | ||||
|         assertEquals("1000", Integer.toBinaryString(8)); | ||||
|         assertEquals("10100", Integer.toBinaryString(20)); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void given_binaryNumber_then_ConvertToDecimalNumber() { | ||||
|         assertEquals(8, Integer.parseInt("1000", 2)); | ||||
|         assertEquals(20, Integer.parseInt("10100", 2)); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void given_binaryNumber_then_returnDecimalNumber() { | ||||
|         assertEquals(Integer.valueOf(8), binaryNumbers.convertBinaryToDecimal(1000)); | ||||
|         assertEquals(Integer.valueOf(20), binaryNumbers.convertBinaryToDecimal(10100)); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void given_twoBinaryNumber_then_returnAddition() { | ||||
|         // adding 4 and 10 | ||||
|         assertEquals(Integer.valueOf(1110), binaryNumbers.addBinaryNumber(100, 1010)); | ||||
| 
 | ||||
|         // adding 26 and 14 | ||||
|         assertEquals(Integer.valueOf(101000), binaryNumbers.addBinaryNumber(11010, 1110)); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void given_twoBinaryNumber_then_returnSubtraction() { | ||||
|         // subtracting 16 from 25 | ||||
|         assertEquals(Integer.valueOf(1001), binaryNumbers.substractBinaryNumber(11001, 10000)); | ||||
| 
 | ||||
|         // subtracting 29 from 16, the output here is negative | ||||
|         assertEquals(Integer.valueOf(1101), binaryNumbers.substractBinaryNumber(10000, 11101)); | ||||
|     } | ||||
| 
 | ||||
|     @Test | ||||
|     public void given_binaryLiteral_thenReturnDecimalValue() { | ||||
| 
 | ||||
|         byte five = 0b101; | ||||
|         assertEquals((byte) 5, five); | ||||
| 
 | ||||
|         short three = 0b11; | ||||
|         assertEquals((short) 3, three); | ||||
| 
 | ||||
|         int nine = 0B1001; | ||||
|         assertEquals(9, nine); | ||||
| 
 | ||||
|         long twentyNine = 0B11101; | ||||
|         assertEquals(29, twentyNine); | ||||
| 
 | ||||
|         int minusThirtySeven = -0B100101; | ||||
|         assertEquals(-37, minusThirtySeven); | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
| } | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user