Skip to content

Commit fc693e8

Browse files
Add Highest Set Bit algorithm (TheAlgorithms#4330)
1 parent 72247ed commit fc693e8

File tree

2 files changed

+69
-0
lines changed

2 files changed

+69
-0
lines changed
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.thealgorithms.bitmanipulation;
2+
import java.util.Optional;
3+
4+
/**
5+
* Find Highest Set Bit
6+
* This class provides a function calculating the position (or index)
7+
* of the most significant bit being set to 1 in a given integer.
8+
* @author Bama Charan Chhandogi (https://github.com/BamaCharanChhandogi)
9+
*/
10+
11+
public final class HighestSetBit {
12+
private HighestSetBit() {
13+
}
14+
15+
public final static Optional<Integer> findHighestSetBit(int num) {
16+
if (num < 0) {
17+
throw new IllegalArgumentException("Input cannot be negative");
18+
}
19+
20+
if (num == 0) {
21+
return Optional.empty();
22+
}
23+
24+
int position = 0;
25+
while (num > 0) {
26+
num >>= 1;
27+
position++;
28+
}
29+
30+
return Optional.of(position - 1);
31+
}
32+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.thealgorithms.bitmanipulation;
2+
3+
import static org.junit.jupiter.api.Assertions.*;
4+
5+
import org.junit.jupiter.api.Test;
6+
7+
/**
8+
* Test case for Highest Set Bit
9+
* @author Bama Charan Chhandogi (https://github.com/BamaCharanChhandogi)
10+
*/
11+
12+
class HighestSetBitTest {
13+
14+
@Test
15+
void testHighestSetBit() {
16+
assertFalse(HighestSetBit.findHighestSetBit(0).isPresent());
17+
assertEquals(0, HighestSetBit.findHighestSetBit(1).get());
18+
assertEquals(1, HighestSetBit.findHighestSetBit(2).get());
19+
assertEquals(1, HighestSetBit.findHighestSetBit(3).get());
20+
assertEquals(2, HighestSetBit.findHighestSetBit(4).get());
21+
assertEquals(2, HighestSetBit.findHighestSetBit(5).get());
22+
assertEquals(2, HighestSetBit.findHighestSetBit(7).get());
23+
assertEquals(3, HighestSetBit.findHighestSetBit(8).get());
24+
assertEquals(3, HighestSetBit.findHighestSetBit(9).get());
25+
assertEquals(3, HighestSetBit.findHighestSetBit(15).get());
26+
assertEquals(4, HighestSetBit.findHighestSetBit(16).get());
27+
assertEquals(4, HighestSetBit.findHighestSetBit(17).get());
28+
assertEquals(4, HighestSetBit.findHighestSetBit(31).get());
29+
assertEquals(5, HighestSetBit.findHighestSetBit(32).get());
30+
assertEquals(5, HighestSetBit.findHighestSetBit(33).get());
31+
assertEquals(7, HighestSetBit.findHighestSetBit(255).get());
32+
assertEquals(8, HighestSetBit.findHighestSetBit(256).get());
33+
assertEquals(8, HighestSetBit.findHighestSetBit(511).get());
34+
assertEquals(9, HighestSetBit.findHighestSetBit(512).get());
35+
assertThrows(IllegalArgumentException.class, () -> HighestSetBit.findHighestSetBit(-37));
36+
}
37+
}

0 commit comments

Comments
 (0)