mirror of
https://github.com/TheAlgorithms/Python.git
synced 2024-11-23 21:11:08 +00:00
Create swap_all_odd_and_even_bits.py (#10692)
* 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>
This commit is contained in:
parent
26ffad9d17
commit
be94690dec
58
bit_manipulation/swap_all_odd_and_even_bits.py
Normal file
58
bit_manipulation/swap_all_odd_and_even_bits.py
Normal file
|
@ -0,0 +1,58 @@
|
|||
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")
|
Loading…
Reference in New Issue
Block a user