Enhance docs, add more tests in SwapAdjacentBits (#5861)

This commit is contained in:
Hardik Pawar
2024-10-29 23:42:46 +05:30
committed by GitHub
parent b31bc86192
commit 54567e2ed3
2 changed files with 48 additions and 10 deletions

View File

@ -1,14 +1,45 @@
package com.thealgorithms.bitmanipulation;
/**
* Swap every pair of adjacent bits of a given number.
* @author Lakshyajeet Singh Goyal (https://github.com/DarkMatter-999)
* A utility class to swap every pair of adjacent bits in a given integer.
* This operation shifts the even-positioned bits to odd positions and vice versa.
*
* Example:
* - Input: 2 (binary: `10`) → Output: 1 (binary: `01`)
* - Input: 43 (binary: `101011`) → Output: 23 (binary: `010111`)
*
* **Explanation of the Algorithm:**
* 1. Mask even-positioned bits: Using `0xAAAAAAAA` (binary: `101010...`),
* which selects bits in even positions.
* 2. Mask odd-positioned bits: Using `0x55555555` (binary: `010101...`),
* which selects bits in odd positions.
* 3. Shift bits:
* - Right-shift even-positioned bits by 1 to move them to odd positions.
* - Left-shift odd-positioned bits by 1 to move them to even positions.
* 4. Combine both shifted results using bitwise OR (`|`) to produce the final result.
*
* Use Case: This algorithm can be useful in applications involving low-level bit manipulation,
* such as encoding, data compression, or cryptographic transformations.
*
* Time Complexity: O(1) (constant time, since operations are bitwise).
*
* Author: Lakshyajeet Singh Goyal (https://github.com/DarkMatter-999)
*/
public final class SwapAdjacentBits {
private SwapAdjacentBits() {
}
/**
* Swaps every pair of adjacent bits of a given integer.
* Steps:
* 1. Mask the even-positioned bits.
* 2. Mask the odd-positioned bits.
* 3. Shift the even bits to the right and the odd bits to the left.
* 4. Combine the shifted bits.
*
* @param num the integer whose bits are to be swapped
* @return the integer after swapping every pair of adjacent bits
*/
public static int swapAdjacentBits(int num) {
// mask the even bits (0xAAAAAAAA => 10101010...)
int evenBits = num & 0xAAAAAAAA;

View File

@ -8,13 +8,20 @@ import org.junit.jupiter.params.provider.CsvSource;
class SwapAdjacentBitsTest {
@ParameterizedTest
@CsvSource({
"2, 1", // 2 (10 in binary) should become 1 (01 in binary)
"43, 23", // 43 should become 23
"153, 102", // 153 should become 102
"15, 15", // 15 (1111) remains 15 (1111)
"0, 0" // 0 (0000) remains 0 (0000)
})
@CsvSource({"2, 1", // 2 (binary: 10) -> 1 (binary: 01)
"43, 23", // 43 (binary: 101011) -> 23 (binary: 010111)
"153, 102", // 153 (binary: 10011001) -> 102 (binary: 01100110)
"15, 15", // 15 (binary: 1111) -> 15 (binary: 1111) (no change)
"0, 0", // 0 (binary: 0000) -> 0 (binary: 0000) (no change)
"1, 2", // 1 (binary: 01) -> 2 (binary: 10)
"170, 85", // 170 (binary: 10101010) -> 85 (binary: 01010101)
"85, 170", // 85 (binary: 01010101) -> 170 (binary: 10101010)
"255, 255", // 255 (binary: 11111111) -> 255 (binary: 11111111) (no change)
"128, 64", // 128 (binary: 10000000) -> 64 (binary: 01000000)
"1024, 2048",
"-1, -1", // -1 (all bits 1) remains -1 (no change due to two's complement)
"-2, -3", // -2 (binary: ...1110) -> -3 (binary: ...1101)
"2147483647, -1073741825", "-2147483648, -1073741824"})
void
testSwapAdjacentBits(int input, int expected) {
assertEquals(expected, SwapAdjacentBits.swapAdjacentBits(input));