From 9a51e836625a277f63afcb3ee56415d72777e340 Mon Sep 17 00:00:00 2001 From: Sweta Pal Date: Thu, 16 Oct 2025 02:34:31 +0530 Subject: [PATCH 1/3] feat(bit_manipulation): add swap_bits function with doctests and validation --- bit_manipulation/binary_swap_bits.py | 68 ++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 bit_manipulation/binary_swap_bits.py diff --git a/bit_manipulation/binary_swap_bits.py b/bit_manipulation/binary_swap_bits.py new file mode 100644 index 000000000000..1999b4f7b231 --- /dev/null +++ b/bit_manipulation/binary_swap_bits.py @@ -0,0 +1,68 @@ +""" +Swap two bits at given positions in a non-negative integer using bitwise operators. + +Wikipedia reference: +https://en.wikipedia.org/wiki/Bit_manipulation +""" + + +def swap_bits(number: int, i: int, j: int) -> int: + """ + Swap the bits at the position i and j (0-indexed from right side) + + Arguments: + number (int): Non-negative integer whose bits are to be swapped. + i (int): Index of 1st bit to swap. + j (int): Index of 2nd bit to swap. + + Returns: + int: Integer obtained after swapping of bits. + + Raises: + TypeError: If argument is not an Integer + ValueError: Invalid argument or bit positions. + + Examples: + >>> swap_bits(28, 0, 2) # 11100 -> swap rightmost bits 0 and 2 + 25 + >>> swap_bits(15, 1, 2) # 1111 -> swapping the bits 1 and 2 + 15 + >>> swap_bits(10, 0, 3) # 1010 -> swap the bits 0 and 3 + 3 + >>> swap_bits(10.5, 0, 3) + Traceback (most recent call last): + ... + TypeError: All arguments MUST be integers! + >>> swap_bits(-5, 1, 3) + Traceback (most recent call last): + ... + ValueError: The number MUST be non-negative! + >>> swap_bits(10, -1, 2) + Traceback (most recent call last): + ... + ValueError: Bit positions MUST be non-negative! + """ + if not all(isinstance(x, int) for x in (number, i, j)): + raise TypeError("All arguments MUST be integers!") + + if number < 0: + raise ValueError("The number MUST be non-negative!") + + if i < 0 or j < 0: + raise ValueError("Bit positions MUST be non-negative!") + + # Extraction of Bits + bit_first = (number >> i) & 1 + bit_second = (number >> j) & 1 + + # If bits differ swap them + if bit_first != bit_second: + number ^= (1 << i) | (1 << j) + + return number + + +if __name__ == "__main__": + import doctest + + doctest.testmod() From 7746511315a3a466cf5cbedadbb0c672a413a38d Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 15 Oct 2025 21:15:13 +0000 Subject: [PATCH 2/3] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- bit_manipulation/binary_swap_bits.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bit_manipulation/binary_swap_bits.py b/bit_manipulation/binary_swap_bits.py index 1999b4f7b231..943f0d313013 100644 --- a/bit_manipulation/binary_swap_bits.py +++ b/bit_manipulation/binary_swap_bits.py @@ -41,7 +41,7 @@ def swap_bits(number: int, i: int, j: int) -> int: Traceback (most recent call last): ... ValueError: Bit positions MUST be non-negative! - """ + """ if not all(isinstance(x, int) for x in (number, i, j)): raise TypeError("All arguments MUST be integers!") From 4139b2d4159ef6e25b62221c200757964cd1c86b Mon Sep 17 00:00:00 2001 From: Sweta Pal Date: Sun, 19 Oct 2025 10:30:47 +0530 Subject: [PATCH 3/3] refactor(bit_manipulation): rename parameters and resolve conflicts in swap_bits --- bit_manipulation/binary_swap_bits.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/bit_manipulation/binary_swap_bits.py b/bit_manipulation/binary_swap_bits.py index 943f0d313013..02d4744f1ee3 100644 --- a/bit_manipulation/binary_swap_bits.py +++ b/bit_manipulation/binary_swap_bits.py @@ -6,14 +6,14 @@ """ -def swap_bits(number: int, i: int, j: int) -> int: +def swap_bits(number: int, first: int, second: int) -> int: """ - Swap the bits at the position i and j (0-indexed from right side) + Swap the bits at the position first and second (0-indexed from right side) Arguments: number (int): Non-negative integer whose bits are to be swapped. - i (int): Index of 1st bit to swap. - j (int): Index of 2nd bit to swap. + first (int): Index of 1st bit to swap. + second (int): Index of 2nd bit to swap. Returns: int: Integer obtained after swapping of bits. @@ -42,22 +42,22 @@ def swap_bits(number: int, i: int, j: int) -> int: ... ValueError: Bit positions MUST be non-negative! """ - if not all(isinstance(x, int) for x in (number, i, j)): + if not all(isinstance(x, int) for x in (number, first, second)): raise TypeError("All arguments MUST be integers!") if number < 0: raise ValueError("The number MUST be non-negative!") - if i < 0 or j < 0: + if first < 0 or second < 0: raise ValueError("Bit positions MUST be non-negative!") # Extraction of Bits - bit_first = (number >> i) & 1 - bit_second = (number >> j) & 1 + bit_first = (number >> first) & 1 + bit_second = (number >> second) & 1 # If bits differ swap them if bit_first != bit_second: - number ^= (1 << i) | (1 << j) + number ^= (1 << first) | (1 << second) return number