From e32cab3189a195a25fe5eeb4089d807ec7d2b7d7 Mon Sep 17 00:00:00 2001 From: Alex Klymenko Date: Fri, 16 Aug 2024 16:48:47 +0200 Subject: [PATCH] refactor: `BinaryToDecimal` (#5330) --- .../conversions/BinaryToDecimal.java | 42 +++++++++---------- .../conversions/BinaryToDecimalTest.java | 9 ++++ 2 files changed, 28 insertions(+), 23 deletions(-) diff --git a/src/main/java/com/thealgorithms/conversions/BinaryToDecimal.java b/src/main/java/com/thealgorithms/conversions/BinaryToDecimal.java index 67b815ab6..36c0790e5 100644 --- a/src/main/java/com/thealgorithms/conversions/BinaryToDecimal.java +++ b/src/main/java/com/thealgorithms/conversions/BinaryToDecimal.java @@ -1,37 +1,33 @@ package com.thealgorithms.conversions; -import java.util.Scanner; - /** * This class converts a Binary number to a Decimal number */ final class BinaryToDecimal { + private static final int BINARY_BASE = 2; + private BinaryToDecimal() { } - public static long binaryToDecimal(long binNum) { - long binCopy; - long d; - long s = 0; - long power = 0; - binCopy = binNum; - while (binCopy != 0) { - d = binCopy % 10; - s += d * (long) Math.pow(2, power++); - binCopy /= 10; - } - return s; - } - /** - * Main Method + * Converts a binary number to its decimal equivalent. * - * @param args Command line arguments + * @param binaryNumber The binary number to convert. + * @return The decimal equivalent of the binary number. + * @throws IllegalArgumentException If the binary number contains digits other than 0 and 1. */ - public static void main(String[] args) { - Scanner sc = new Scanner(System.in); - System.out.print("Binary number: "); - System.out.println("Decimal equivalent:" + binaryToDecimal(sc.nextLong())); - sc.close(); + public static long binaryToDecimal(long binaryNumber) { + long decimalValue = 0; + long power = 0; + + while (binaryNumber != 0) { + long digit = binaryNumber % 10; + if (digit > 1) { + throw new IllegalArgumentException("Incorrect binary digit: " + digit); + } + decimalValue += (long) (digit * Math.pow(BINARY_BASE, power++)); + binaryNumber /= 10; + } + return decimalValue; } } diff --git a/src/test/java/com/thealgorithms/conversions/BinaryToDecimalTest.java b/src/test/java/com/thealgorithms/conversions/BinaryToDecimalTest.java index 2471f919a..9045d1002 100644 --- a/src/test/java/com/thealgorithms/conversions/BinaryToDecimalTest.java +++ b/src/test/java/com/thealgorithms/conversions/BinaryToDecimalTest.java @@ -1,8 +1,11 @@ package com.thealgorithms.conversions; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; public class BinaryToDecimalTest { @@ -30,4 +33,10 @@ public class BinaryToDecimalTest { assertEquals(262144L, BinaryToDecimal.binaryToDecimal(1000000000000000000L)); assertEquals(524287L, BinaryToDecimal.binaryToDecimal(1111111111111111111L)); } + + @ParameterizedTest + @CsvSource({"2", "1234", "11112", "101021"}) + void testNotCorrectBinaryInput(long binaryNumber) { + assertThrows(IllegalArgumentException.class, () -> BinaryToDecimal.binaryToDecimal(binaryNumber)); + } }