From f77074a8ac4e0ed5ad8b381e75dbf57b76b8bf56 Mon Sep 17 00:00:00 2001 From: NikhithaBandari <91549688+NikhithaBandari@users.noreply.github.com> Date: Thu, 19 Oct 2023 14:16:08 +0530 Subject: [PATCH 1/7] Create swap_all_odd_and_even_bits.py --- .../swap_all_odd_and_even_bits.py | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 bit_manipulation/swap_all_odd_and_even_bits.py diff --git a/bit_manipulation/swap_all_odd_and_even_bits.py b/bit_manipulation/swap_all_odd_and_even_bits.py new file mode 100644 index 000000000000..2bc293b2790e --- /dev/null +++ b/bit_manipulation/swap_all_odd_and_even_bits.py @@ -0,0 +1,26 @@ +def swap_odd_even_bits(num): + # Get all even bits + even_bits = num & 0xAAAAAAAA # 0xAAAAAAAA is a 32-bit number with all even bits set to 1 + + # Get all odd bits + odd_bits = num & 0x55555555 # 0x55555555 is a 32-bit number with all odd bits set to 1 + + # Right shift even bits by 1 and left shift odd bits by 1 to swap them + even_bits >>= 1 + odd_bits <<= 1 + + # Combine the swapped even and odd bits + result = even_bits | odd_bits + + return result + +# Example usage: +num = 23 # Binary: 10111 +swapped_num = swap_odd_even_bits(num) # Result: 43 (Binary: 101011) +print(swapped_num) + +# In this code: + +# 1. We use bitwise AND operations to separate the even bits (0, 2, 4, 6, etc.) and odd bits (1, 3, 5, 7, etc.) in the input number. +# 2. We then right-shift the even bits by 1 position and left-shift the odd bits by 1 position to swap them. +# 3. Finally, we combine the swapped even and odd bits using a bitwise OR operation to obtain the final result. From afefd2748fc17ce1652518c0c8c0363180e27b42 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 19 Oct 2023 08:54:27 +0000 Subject: [PATCH 2/7] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- bit_manipulation/swap_all_odd_and_even_bits.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/bit_manipulation/swap_all_odd_and_even_bits.py b/bit_manipulation/swap_all_odd_and_even_bits.py index 2bc293b2790e..c44950a34511 100644 --- a/bit_manipulation/swap_all_odd_and_even_bits.py +++ b/bit_manipulation/swap_all_odd_and_even_bits.py @@ -1,9 +1,13 @@ def swap_odd_even_bits(num): # Get all even bits - even_bits = num & 0xAAAAAAAA # 0xAAAAAAAA is a 32-bit number with all even bits set to 1 + even_bits = ( + num & 0xAAAAAAAA + ) # 0xAAAAAAAA is a 32-bit number with all even bits set to 1 # Get all odd bits - odd_bits = num & 0x55555555 # 0x55555555 is a 32-bit number with all odd bits set to 1 + odd_bits = ( + num & 0x55555555 + ) # 0x55555555 is a 32-bit number with all odd bits set to 1 # Right shift even bits by 1 and left shift odd bits by 1 to swap them even_bits >>= 1 @@ -14,6 +18,7 @@ def swap_odd_even_bits(num): return result + # Example usage: num = 23 # Binary: 10111 swapped_num = swap_odd_even_bits(num) # Result: 43 (Binary: 101011) From a941570decad9dcc801858fb295ee19ad348938c Mon Sep 17 00:00:00 2001 From: Christian Clauss Date: Thu, 19 Oct 2023 19:28:19 +0200 Subject: [PATCH 3/7] Update swap_all_odd_and_even_bits.py --- .../swap_all_odd_and_even_bits.py | 84 ++++++++++++------- 1 file changed, 53 insertions(+), 31 deletions(-) diff --git a/bit_manipulation/swap_all_odd_and_even_bits.py b/bit_manipulation/swap_all_odd_and_even_bits.py index c44950a34511..3add36eb1039 100644 --- a/bit_manipulation/swap_all_odd_and_even_bits.py +++ b/bit_manipulation/swap_all_odd_and_even_bits.py @@ -1,31 +1,53 @@ -def swap_odd_even_bits(num): - # Get all even bits - even_bits = ( - num & 0xAAAAAAAA - ) # 0xAAAAAAAA is a 32-bit number with all even bits set to 1 - - # Get all odd bits - odd_bits = ( - num & 0x55555555 - ) # 0x55555555 is a 32-bit number with all odd bits set to 1 - - # Right shift even bits by 1 and left shift odd bits by 1 to swap them - even_bits >>= 1 - odd_bits <<= 1 - - # Combine the swapped even and odd bits - result = even_bits | odd_bits - - return result - - -# Example usage: -num = 23 # Binary: 10111 -swapped_num = swap_odd_even_bits(num) # Result: 43 (Binary: 101011) -print(swapped_num) - -# In this code: - -# 1. We use bitwise AND operations to separate the even bits (0, 2, 4, 6, etc.) and odd bits (1, 3, 5, 7, etc.) in the input number. -# 2. We then right-shift the even bits by 1 position and left-shift the odd bits by 1 position to swap them. -# 3. Finally, we combine the swapped even and odd bits using a bitwise OR operation to obtain the final result. +def show_bits(before: int, after: int) -> str: + return f"{before}: {before:08b}\n{after}: {after:08b}" + + +def swap_odd_even_bits(num: int) -> int: + """ + 1. We use bitwise AND operations to separate the even bits (0, 2, 4, 6, etc.) and + odd bits (1, 3, 5, 7, etc.) in the input number. + 2. We then right-shift the even bits by 1 position and left-shift the odd bits by + 1 position to swap them. + 3. Finally, we combine the swapped even and odd bits using a bitwise OR operation + to obtain the final result. + >>> print(show_bits(0, swap_odd_even_bits(0))) + 0: 00000000 + 0: 00000000 + >>> print(show_bits(1, swap_odd_even_bits(1))) + 1: 00000001 + 2: 00000010 + >>> print(show_bits(2, swap_odd_even_bits(2))) + 2: 00000010 + 1: 00000001 + >>> print(show_bits(3, swap_odd_even_bits(3))) + 3: 00000011 + 3: 00000011 + >>> print(show_bits(4, swap_odd_even_bits(4))) + 4: 00000100 + 8: 00001000 + >>> print(show_bits(5, swap_odd_even_bits(5))) + 5: 00000101 + 10: 00001010 + >>> print(show_bits(6, swap_odd_even_bits(6))) + 6: 00000110 + 5: 00000101 + >>> print(show_bits(23, swap_odd_even_bits(23))) + 23: 00010111 + 43: 00101011 + """ + # Get all even bits - 0xAAAAAAAA is a 32-bit number with all even bits set to 1 + even_bits = num & 0xAAAAAAAA + + # Get all odd bits - 0x55555555 is a 32-bit number with all odd bits set to 1 + odd_bits = num & 0x55555555 + + # Right shift even bits and left shift odd bits and swap them + return even_bits >> 1 | odd_bits << 1 + + +if __name__ == "__main__": + import doctest + + doctest.testmod() + for i in (-1, 0, 1, 2, 3, 4, 23, 24): + print(show_bits(i, swap_odd_even_bits(i)), '\n') From f7c11470e3c097e80b000da4daa82c6b3c360763 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 19 Oct 2023 17:28:53 +0000 Subject: [PATCH 4/7] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- bit_manipulation/swap_all_odd_and_even_bits.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bit_manipulation/swap_all_odd_and_even_bits.py b/bit_manipulation/swap_all_odd_and_even_bits.py index 3add36eb1039..baab4a9ef35a 100644 --- a/bit_manipulation/swap_all_odd_and_even_bits.py +++ b/bit_manipulation/swap_all_odd_and_even_bits.py @@ -50,4 +50,4 @@ def swap_odd_even_bits(num: int) -> int: doctest.testmod() for i in (-1, 0, 1, 2, 3, 4, 23, 24): - print(show_bits(i, swap_odd_even_bits(i)), '\n') + print(show_bits(i, swap_odd_even_bits(i)), "\n") From 4c8e3fdbeb99c46ac1a8447233f794d297a61766 Mon Sep 17 00:00:00 2001 From: Christian Clauss Date: Thu, 19 Oct 2023 19:36:51 +0200 Subject: [PATCH 5/7] 6: 00000110 --> 9: 00001001 --- bit_manipulation/swap_all_odd_and_even_bits.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bit_manipulation/swap_all_odd_and_even_bits.py b/bit_manipulation/swap_all_odd_and_even_bits.py index baab4a9ef35a..dac14548bc23 100644 --- a/bit_manipulation/swap_all_odd_and_even_bits.py +++ b/bit_manipulation/swap_all_odd_and_even_bits.py @@ -30,7 +30,7 @@ def swap_odd_even_bits(num: int) -> int: 10: 00001010 >>> print(show_bits(6, swap_odd_even_bits(6))) 6: 00000110 - 5: 00000101 + 9: 00001001 >>> print(show_bits(23, swap_odd_even_bits(23))) 23: 00010111 43: 00101011 From ccccc95c8a0fbe1fe5afc11f6ef88d7f56a49ad2 Mon Sep 17 00:00:00 2001 From: Christian Clauss Date: Thu, 19 Oct 2023 19:48:21 +0200 Subject: [PATCH 6/7] Update swap_all_odd_and_even_bits.py --- .../swap_all_odd_and_even_bits.py | 41 +++++++++++-------- 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/bit_manipulation/swap_all_odd_and_even_bits.py b/bit_manipulation/swap_all_odd_and_even_bits.py index dac14548bc23..92e0482f12a8 100644 --- a/bit_manipulation/swap_all_odd_and_even_bits.py +++ b/bit_manipulation/swap_all_odd_and_even_bits.py @@ -1,5 +1,10 @@ def show_bits(before: int, after: int) -> str: - return f"{before}: {before:08b}\n{after}: {after:08b}" + """ + >>> print(show_bits(0, 0xFFFF)) + 0: 00000000 + 65535: 1111111111111111 + """ + return f"{before:>5}: {before:08b}\n{after:>5}: {after:08b}" def swap_odd_even_bits(num: int) -> int: @@ -11,29 +16,29 @@ def swap_odd_even_bits(num: int) -> int: 3. Finally, we combine the swapped even and odd bits using a bitwise OR operation to obtain the final result. >>> print(show_bits(0, swap_odd_even_bits(0))) - 0: 00000000 - 0: 00000000 + 0: 00000000 + 0: 00000000 >>> print(show_bits(1, swap_odd_even_bits(1))) - 1: 00000001 - 2: 00000010 + 1: 00000001 + 2: 00000010 >>> print(show_bits(2, swap_odd_even_bits(2))) - 2: 00000010 - 1: 00000001 + 2: 00000010 + 1: 00000001 >>> print(show_bits(3, swap_odd_even_bits(3))) - 3: 00000011 - 3: 00000011 + 3: 00000011 + 3: 00000011 >>> print(show_bits(4, swap_odd_even_bits(4))) - 4: 00000100 - 8: 00001000 + 4: 00000100 + 8: 00001000 >>> print(show_bits(5, swap_odd_even_bits(5))) - 5: 00000101 - 10: 00001010 + 5: 00000101 + 10: 00001010 >>> print(show_bits(6, swap_odd_even_bits(6))) - 6: 00000110 - 9: 00001001 + 6: 00000110 + 9: 00001001 >>> print(show_bits(23, swap_odd_even_bits(23))) - 23: 00010111 - 43: 00101011 + 23: 00010111 + 43: 00101011 """ # Get all even bits - 0xAAAAAAAA is a 32-bit number with all even bits set to 1 even_bits = num & 0xAAAAAAAA @@ -50,4 +55,4 @@ def swap_odd_even_bits(num: int) -> int: doctest.testmod() for i in (-1, 0, 1, 2, 3, 4, 23, 24): - print(show_bits(i, swap_odd_even_bits(i)), "\n") + print(show_bits(i, swap_odd_even_bits(i)), '\n') From 8038fde554481e5b5167a540843e9afb4817b111 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 19 Oct 2023 17:49:02 +0000 Subject: [PATCH 7/7] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- bit_manipulation/swap_all_odd_and_even_bits.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bit_manipulation/swap_all_odd_and_even_bits.py b/bit_manipulation/swap_all_odd_and_even_bits.py index 92e0482f12a8..5ec84417bea6 100644 --- a/bit_manipulation/swap_all_odd_and_even_bits.py +++ b/bit_manipulation/swap_all_odd_and_even_bits.py @@ -55,4 +55,4 @@ def swap_odd_even_bits(num: int) -> int: doctest.testmod() for i in (-1, 0, 1, 2, 3, 4, 23, 24): - print(show_bits(i, swap_odd_even_bits(i)), '\n') + print(show_bits(i, swap_odd_even_bits(i)), "\n")