mirror of
https://github.com/TheAlgorithms/Python.git
synced 2024-11-30 16:31:08 +00:00
be94690dec
* Create swap_all_odd_and_even_bits.py * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Update swap_all_odd_and_even_bits.py * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * 6: 00000110 --> 9: 00001001 * Update swap_all_odd_and_even_bits.py * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Christian Clauss <cclauss@me.com>
59 lines
1.8 KiB
Python
59 lines
1.8 KiB
Python
def show_bits(before: int, after: int) -> str:
|
|
"""
|
|
>>> 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:
|
|
"""
|
|
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
|
|
9: 00001001
|
|
>>> 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")
|