From 9a51e836625a277f63afcb3ee56415d72777e340 Mon Sep 17 00:00:00 2001 From: Sweta Pal Date: Thu, 16 Oct 2025 02:34:31 +0530 Subject: [PATCH 1/2] 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/2] [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!")