Skip to content

Commit 21eff8a

Browse files
Added binary string to decimal converter (#6915)
added binary string to decimal converter
1 parent ae2e40a commit 21eff8a

File tree

2 files changed

+40
-0
lines changed

2 files changed

+40
-0
lines changed

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

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,30 @@ 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 contains digits other than 0 and 1.
40+
*/
41+
public static long binaryStringToDecimal(String binary) {
42+
boolean isNegative = binary.charAt(0) == '-';
43+
if (isNegative) {
44+
binary = binary.substring(1);
45+
}
46+
47+
long decimalValue = 0;
48+
49+
for (char bit : binary.toCharArray()) {
50+
if (bit != '0' && bit != '1') {
51+
throw new IllegalArgumentException("Incorrect binary digit: " + bit);
52+
}
53+
// shift left by 1 (multiply by 2) and add bit value
54+
decimalValue = (decimalValue << 1) | (bit - '0');
55+
}
56+
57+
return isNegative ? -decimalValue : decimalValue;
58+
}
3359
}

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)