Skip to content

Commit 458d160

Browse files
added binary string to decimal converter
1 parent b190cb7 commit 458d160

File tree

2 files changed

+44
-0
lines changed

2 files changed

+44
-0
lines changed

src/main/java/com/thealgorithms/conversions/BinaryToDecimal.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,34 @@ public static long binaryToDecimal(long binaryNumber) {
3030
}
3131
return decimalValue;
3232
}
33+
34+
/**
35+
* Converts a binary String to its decimal equivalent using bitwise operators.
36+
*
37+
* @param binary The binary number to convert.
38+
* @return The decimal equivalent of the binary number.
39+
* @throws IllegalArgumentException If the binary number is null or empty, or contains digits other than 0 and 1.
40+
*/
41+
public static long binaryStringToDecimal(String binary) {
42+
if (binary == null || binary.isEmpty()) {
43+
throw new IllegalArgumentException("Input cannot be null or empty");
44+
}
45+
46+
boolean isNegative = binary.charAt(0) == '-';
47+
if (isNegative) {
48+
binary = binary.substring(1);
49+
}
50+
51+
long decimalValue = 0;
52+
53+
for (char bit : binary.toCharArray()) {
54+
if (bit != '0' && bit != '1') {
55+
throw new IllegalArgumentException("Incorrect binary digit: " + bit);
56+
}
57+
// shift left by 1 (multiply by 2) and add bit value
58+
decimalValue = (decimalValue << 1) | (bit - '0');
59+
}
60+
61+
return isNegative ? -decimalValue : decimalValue;
62+
}
3363
}

src/test/java/com/thealgorithms/conversions/BinaryToDecimalTest.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,25 +18,39 @@ public void testBinaryToDecimal() {
1818
assertEquals(5, BinaryToDecimal.binaryToDecimal(101));
1919
assertEquals(63, BinaryToDecimal.binaryToDecimal(111111));
2020
assertEquals(512, BinaryToDecimal.binaryToDecimal(1000000000));
21+
22+
assertEquals(0, BinaryToDecimal.binaryStringToDecimal("0"));
23+
assertEquals(1, BinaryToDecimal.binaryStringToDecimal("1"));
24+
assertEquals(5, BinaryToDecimal.binaryStringToDecimal("101"));
25+
assertEquals(63, BinaryToDecimal.binaryStringToDecimal("111111"));
26+
assertEquals(512, BinaryToDecimal.binaryStringToDecimal("1000000000"));
2127
}
2228

2329
@Test
2430
// Test converting negative binary numbers
2531
public void testNegativeBinaryToDecimal() {
2632
assertEquals(-1, BinaryToDecimal.binaryToDecimal(-1));
2733
assertEquals(-42, BinaryToDecimal.binaryToDecimal(-101010));
34+
35+
assertEquals(-1, BinaryToDecimal.binaryStringToDecimal("-1"));
36+
assertEquals(-42, BinaryToDecimal.binaryStringToDecimal("-101010"));
2837
}
2938

3039
@Test
3140
// Test converting binary numbers with large values
3241
public void testLargeBinaryToDecimal() {
3342
assertEquals(262144L, BinaryToDecimal.binaryToDecimal(1000000000000000000L));
3443
assertEquals(524287L, BinaryToDecimal.binaryToDecimal(1111111111111111111L));
44+
45+
assertEquals(262144L, BinaryToDecimal.binaryStringToDecimal("1000000000000000000"));
46+
assertEquals(524287L, BinaryToDecimal.binaryStringToDecimal("1111111111111111111"));
3547
}
3648

3749
@ParameterizedTest
3850
@CsvSource({"2", "1234", "11112", "101021"})
3951
void testNotCorrectBinaryInput(long binaryNumber) {
4052
assertThrows(IllegalArgumentException.class, () -> BinaryToDecimal.binaryToDecimal(binaryNumber));
53+
54+
assertThrows(IllegalArgumentException.class, () -> BinaryToDecimal.binaryStringToDecimal(Long.toString(binaryNumber)));
4155
}
4256
}

0 commit comments

Comments
 (0)