Skip to content

Commit e877687

Browse files
feat: add Swap Odd and Even Bits algorithm (#964)
1 parent 6bed9d5 commit e877687

File tree

3 files changed

+87
-12
lines changed

3 files changed

+87
-12
lines changed

DIRECTORY.md

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
* [Graph Coloring](https://github.com/TheAlgorithms/Rust/blob/master/src/backtracking/graph_coloring.rs)
77
* [Hamiltonian Cycle](https://github.com/TheAlgorithms/Rust/blob/master/src/backtracking/hamiltonian_cycle.rs)
88
* [Knight Tour](https://github.com/TheAlgorithms/Rust/blob/master/src/backtracking/knight_tour.rs)
9-
* [N Queens](https://github.com/TheAlgorithms/Rust/blob/master/src/backtracking/n_queens.rs)
9+
* [N-Queens](https://github.com/TheAlgorithms/Rust/blob/master/src/backtracking/n_queens.rs)
1010
* [Parentheses Generator](https://github.com/TheAlgorithms/Rust/blob/master/src/backtracking/parentheses_generator.rs)
1111
* [Permutations](https://github.com/TheAlgorithms/Rust/blob/master/src/backtracking/permutations.rs)
1212
* [Rat In Maze](https://github.com/TheAlgorithms/Rust/blob/master/src/backtracking/rat_in_maze.rs)
@@ -22,9 +22,10 @@
2222
* [N Bits Gray Code](https://github.com/TheAlgorithms/Rust/blob/master/src/bit_manipulation/n_bits_gray_code.rs)
2323
* [Reverse Bits](https://github.com/TheAlgorithms/Rust/blob/master/src/bit_manipulation/reverse_bits.rs)
2424
* [Sum Of Two Integers](https://github.com/TheAlgorithms/Rust/blob/master/src/bit_manipulation/sum_of_two_integers.rs)
25+
* [Swap Odd and Even Bits](https://github.com/TheAlgorithms/Rust/blob/master/src/bit_manipulation/swap_odd_even_bits.rs)
2526
* Ciphers
26-
* [Aes](https://github.com/TheAlgorithms/Rust/blob/master/src/ciphers/aes.rs)
27-
* [Another Rot13](https://github.com/TheAlgorithms/Rust/blob/master/src/ciphers/another_rot13.rs)
27+
* [AES](https://github.com/TheAlgorithms/Rust/blob/master/src/ciphers/aes.rs)
28+
* [Another ROT13](https://github.com/TheAlgorithms/Rust/blob/master/src/ciphers/another_rot13.rs)
2829
* [Baconian Cipher](https://github.com/TheAlgorithms/Rust/blob/master/src/ciphers/baconian_cipher.rs)
2930
* [Base64](https://github.com/TheAlgorithms/Rust/blob/master/src/ciphers/base64.rs)
3031
* [Blake2B](https://github.com/TheAlgorithms/Rust/blob/master/src/ciphers/blake2b.rs)
@@ -36,15 +37,15 @@
3637
* [Morse Code](https://github.com/TheAlgorithms/Rust/blob/master/src/ciphers/morse_code.rs)
3738
* [Polybius](https://github.com/TheAlgorithms/Rust/blob/master/src/ciphers/polybius.rs)
3839
* [Rail Fence](https://github.com/TheAlgorithms/Rust/blob/master/src/ciphers/rail_fence.rs)
39-
* [Rot13](https://github.com/TheAlgorithms/Rust/blob/master/src/ciphers/rot13.rs)
40+
* [ROT13](https://github.com/TheAlgorithms/Rust/blob/master/src/ciphers/rot13.rs)
4041
* [Salsa](https://github.com/TheAlgorithms/Rust/blob/master/src/ciphers/salsa.rs)
4142
* [SHA-256](https://github.com/TheAlgorithms/Rust/blob/master/src/ciphers/sha256.rs)
4243
* [SHA-3](https://github.com/TheAlgorithms/Rust/blob/master/src/ciphers/sha3.rs)
4344
* [Tea](https://github.com/TheAlgorithms/Rust/blob/master/src/ciphers/tea.rs)
44-
* [Theoretical Rot13](https://github.com/TheAlgorithms/Rust/blob/master/src/ciphers/theoretical_rot13.rs)
45+
* [Theoretical ROT13](https://github.com/TheAlgorithms/Rust/blob/master/src/ciphers/theoretical_rot13.rs)
4546
* [Transposition](https://github.com/TheAlgorithms/Rust/blob/master/src/ciphers/transposition.rs)
4647
* [Vigenere](https://github.com/TheAlgorithms/Rust/blob/master/src/ciphers/vigenere.rs)
47-
* [Xor](https://github.com/TheAlgorithms/Rust/blob/master/src/ciphers/xor.rs)
48+
* [XOR](https://github.com/TheAlgorithms/Rust/blob/master/src/ciphers/xor.rs)
4849
* Compression
4950
* [Move To Front](https://github.com/TheAlgorithms/Rust/blob/master/src/compression/move_to_front.rs)
5051
* [Run Length Encoding](https://github.com/TheAlgorithms/Rust/blob/master/src/compression/run_length_encoding.rs)
@@ -65,7 +66,7 @@
6566
* [RGB-CMYK Conversion](https://github.com/TheAlgorithms/Rust/blob/master/src/conversions/rgb_cmyk_conversion.rs)
6667
* Data Structures
6768
* [AVL Tree](https://github.com/TheAlgorithms/Rust/blob/master/src/data_structures/avl_tree.rs)
68-
* [B Tree](https://github.com/TheAlgorithms/Rust/blob/master/src/data_structures/b_tree.rs)
69+
* [B-Tree](https://github.com/TheAlgorithms/Rust/blob/master/src/data_structures/b_tree.rs)
6970
* [Binary Search Tree](https://github.com/TheAlgorithms/Rust/blob/master/src/data_structures/binary_search_tree.rs)
7071
* [Fenwick Tree](https://github.com/TheAlgorithms/Rust/blob/master/src/data_structures/fenwick_tree.rs)
7172
* [Floyds Algorithm](https://github.com/TheAlgorithms/Rust/blob/master/src/data_structures/floyds_algorithm.rs)
@@ -175,14 +176,14 @@
175176
* [Lib](https://github.com/TheAlgorithms/Rust/blob/master/src/lib.rs)
176177
* Machine Learning
177178
* [Cholesky](https://github.com/TheAlgorithms/Rust/blob/master/src/machine_learning/cholesky.rs)
178-
* [K Means](https://github.com/TheAlgorithms/Rust/blob/master/src/machine_learning/k_means.rs)
179+
* [K-Means](https://github.com/TheAlgorithms/Rust/blob/master/src/machine_learning/k_means.rs)
179180
* [Linear Regression](https://github.com/TheAlgorithms/Rust/blob/master/src/machine_learning/linear_regression.rs)
180181
* [Logistic Regression](https://github.com/TheAlgorithms/Rust/blob/master/src/machine_learning/logistic_regression.rs)
181182
* Loss Function
182183
* [Average Margin Ranking Loss](https://github.com/TheAlgorithms/Rust/blob/master/src/machine_learning/loss_function/average_margin_ranking_loss.rs)
183184
* [Hinge Loss](https://github.com/TheAlgorithms/Rust/blob/master/src/machine_learning/loss_function/hinge_loss.rs)
184185
* [Huber Loss](https://github.com/TheAlgorithms/Rust/blob/master/src/machine_learning/loss_function/huber_loss.rs)
185-
* [Kl Divergence Loss](https://github.com/TheAlgorithms/Rust/blob/master/src/machine_learning/loss_function/kl_divergence_loss.rs)
186+
* [KL Divergence Loss](https://github.com/TheAlgorithms/Rust/blob/master/src/machine_learning/loss_function/kl_divergence_loss.rs)
186187
* [Mean Absolute Error Loss](https://github.com/TheAlgorithms/Rust/blob/master/src/machine_learning/loss_function/mean_absolute_error_loss.rs)
187188
* [Mean Squared Error Loss](https://github.com/TheAlgorithms/Rust/blob/master/src/machine_learning/loss_function/mean_squared_error_loss.rs)
188189
* [Negative Log Likelihood](https://github.com/TheAlgorithms/Rust/blob/master/src/machine_learning/loss_function/negative_log_likelihood.rs)
@@ -223,7 +224,7 @@
223224
* [Frizzy Number](https://github.com/TheAlgorithms/Rust/blob/master/src/math/frizzy_number.rs)
224225
* [Gaussian Elimination](https://github.com/TheAlgorithms/Rust/blob/master/src/math/gaussian_elimination.rs)
225226
* [Gaussian Error Linear Unit](https://github.com/TheAlgorithms/Rust/blob/master/src/math/gaussian_error_linear_unit.rs)
226-
* [Gcd Of N Numbers](https://github.com/TheAlgorithms/Rust/blob/master/src/math/gcd_of_n_numbers.rs)
227+
* [GCD Of N Numbers](https://github.com/TheAlgorithms/Rust/blob/master/src/math/gcd_of_n_numbers.rs)
227228
* [Geometric Series](https://github.com/TheAlgorithms/Rust/blob/master/src/math/geometric_series.rs)
228229
* [Greatest Common Divisor](https://github.com/TheAlgorithms/Rust/blob/master/src/math/greatest_common_divisor.rs)
229230
* [Huber Loss](https://github.com/TheAlgorithms/Rust/blob/master/src/math/huber_loss.rs)
@@ -232,7 +233,7 @@
232233
* [Interpolation](https://github.com/TheAlgorithms/Rust/blob/master/src/math/interpolation.rs)
233234
* [Interquartile Range](https://github.com/TheAlgorithms/Rust/blob/master/src/math/interquartile_range.rs)
234235
* [Karatsuba Multiplication](https://github.com/TheAlgorithms/Rust/blob/master/src/math/karatsuba_multiplication.rs)
235-
* [Lcm Of N Numbers](https://github.com/TheAlgorithms/Rust/blob/master/src/math/lcm_of_n_numbers.rs)
236+
* [LCM Of N Numbers](https://github.com/TheAlgorithms/Rust/blob/master/src/math/lcm_of_n_numbers.rs)
236237
* [Leaky Relu](https://github.com/TheAlgorithms/Rust/blob/master/src/math/leaky_relu.rs)
237238
* [Least Square Approx](https://github.com/TheAlgorithms/Rust/blob/master/src/math/least_square_approx.rs)
238239
* [Linear Sieve](https://github.com/TheAlgorithms/Rust/blob/master/src/math/linear_sieve.rs)
@@ -325,7 +326,7 @@
325326
* [Patience Sort](https://github.com/TheAlgorithms/Rust/blob/master/src/sorting/patience_sort.rs)
326327
* [Pigeonhole Sort](https://github.com/TheAlgorithms/Rust/blob/master/src/sorting/pigeonhole_sort.rs)
327328
* [Quick Sort](https://github.com/TheAlgorithms/Rust/blob/master/src/sorting/quick_sort.rs)
328-
* [Quick Sort 3_ways](https://github.com/TheAlgorithms/Rust/blob/master/src/sorting/quick_sort_3_ways.rs)
329+
* [Quick Sort 3-ways](https://github.com/TheAlgorithms/Rust/blob/master/src/sorting/quick_sort_3_ways.rs)
329330
* [Radix Sort](https://github.com/TheAlgorithms/Rust/blob/master/src/sorting/radix_sort.rs)
330331
* [Selection Sort](https://github.com/TheAlgorithms/Rust/blob/master/src/sorting/selection_sort.rs)
331332
* [Shell Sort](https://github.com/TheAlgorithms/Rust/blob/master/src/sorting/shell_sort.rs)

src/bit_manipulation/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@ mod highest_set_bit;
33
mod n_bits_gray_code;
44
mod reverse_bits;
55
mod sum_of_two_integers;
6+
mod swap_odd_even_bits;
67

78
pub use counting_bits::count_set_bits;
89
pub use highest_set_bit::find_highest_set_bit;
910
pub use n_bits_gray_code::generate_gray_code;
1011
pub use reverse_bits::reverse_bits;
1112
pub use sum_of_two_integers::add_two_integers;
13+
pub use swap_odd_even_bits::swap_odd_even_bits;
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
/// Swaps odd and even bits in an integer.
2+
///
3+
/// This function separates the even bits (0, 2, 4, 6, etc.) and odd bits (1, 3, 5, 7, etc.)
4+
/// using bitwise AND operations, then swaps them by shifting and combining with OR.
5+
///
6+
/// # Arguments
7+
///
8+
/// * `num` - A 32-bit unsigned integer
9+
///
10+
/// # Returns
11+
///
12+
/// A new integer with odd and even bits swapped
13+
///
14+
/// # Examples
15+
///
16+
/// ```
17+
/// use the_algorithms_rust::bit_manipulation::swap_odd_even_bits;
18+
///
19+
/// assert_eq!(swap_odd_even_bits(0), 0);
20+
/// assert_eq!(swap_odd_even_bits(1), 2);
21+
/// assert_eq!(swap_odd_even_bits(2), 1);
22+
/// assert_eq!(swap_odd_even_bits(3), 3);
23+
/// assert_eq!(swap_odd_even_bits(4), 8);
24+
/// assert_eq!(swap_odd_even_bits(5), 10);
25+
/// assert_eq!(swap_odd_even_bits(6), 9);
26+
/// assert_eq!(swap_odd_even_bits(23), 43);
27+
/// ```
28+
pub fn swap_odd_even_bits(num: u32) -> u32 {
29+
// Get all even bits - 0xAAAAAAAA is a 32-bit number with all even bits set to 1
30+
let even_bits = num & 0xAAAAAAAA;
31+
32+
// Get all odd bits - 0x55555555 is a 32-bit number with all odd bits set to 1
33+
let odd_bits = num & 0x55555555;
34+
35+
// Right shift even bits and left shift odd bits and swap them
36+
(even_bits >> 1) | (odd_bits << 1)
37+
}
38+
39+
#[cfg(test)]
40+
mod tests {
41+
use super::*;
42+
43+
#[test]
44+
fn test_swap_odd_even_bits() {
45+
assert_eq!(swap_odd_even_bits(0), 0);
46+
assert_eq!(swap_odd_even_bits(1), 2);
47+
assert_eq!(swap_odd_even_bits(2), 1);
48+
assert_eq!(swap_odd_even_bits(3), 3);
49+
assert_eq!(swap_odd_even_bits(4), 8);
50+
assert_eq!(swap_odd_even_bits(5), 10);
51+
assert_eq!(swap_odd_even_bits(6), 9);
52+
assert_eq!(swap_odd_even_bits(23), 43);
53+
assert_eq!(swap_odd_even_bits(24), 36);
54+
}
55+
56+
#[test]
57+
fn test_edge_cases() {
58+
// All bits set
59+
assert_eq!(swap_odd_even_bits(0xFFFFFFFF), 0xFFFFFFFF);
60+
61+
// Alternating patterns
62+
assert_eq!(swap_odd_even_bits(0xAAAAAAAA), 0x55555555);
63+
assert_eq!(swap_odd_even_bits(0x55555555), 0xAAAAAAAA);
64+
}
65+
66+
#[test]
67+
fn test_power_of_two() {
68+
assert_eq!(swap_odd_even_bits(16), 32);
69+
assert_eq!(swap_odd_even_bits(32), 16);
70+
assert_eq!(swap_odd_even_bits(64), 128);
71+
}
72+
}

0 commit comments

Comments
 (0)