mirror of
https://github.com/TheAlgorithms/Python.git
synced 2024-12-18 01:00:15 +00:00
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")
|