如何将计算 9 位位掩码中 1 数量的 C 函数转换为 Rust?
How do I convert a C function that counts the number of ones in a 9-bit bitmask to Rust?
我有一个 u16
,我用它来保存 9 位位掩码,我想知道它包含多少 1
。
我 found this algorithm 我不知道它是如何或为什么起作用的:
/* count number of 1's in 9-bit argument (Schroeppel) */
unsigned count_ones(unsigned36 a) {
return ((a * 01001001001) /* 4 adjacent copies */
& 042104210421) /* every 4th bit */
% 15; /* casting out 15.'s in hexadecimal */
}
如何将其转换为 Rust 函数?这是我试过但不起作用的方法:
fn main() {
let a: u16 = 0b101_100_000;
println!("Ones in {:b}: {}", a, num_of_ones(a));
}
fn num_of_ones(quantity: u16) -> u8 {
(((quantity as u64 * 01_001_001_001) & 042_104_210_421) % 15) as u8
}
C 中的前导零 denotes an octal literal。 Rust 八进制以 0o
开头,就像您已经使用的 0b
:
(((quantity as u64 * 0o01_001_001_001) & 0o042_104_210_421) % 15) as u8
但是,不需要这个,因为它是 built-in,例如 u16::count_ones
:
println!("Ones in {:b}: {}", a, a.count_ones());
另请参阅:
我有一个 u16
,我用它来保存 9 位位掩码,我想知道它包含多少 1
。
我 found this algorithm 我不知道它是如何或为什么起作用的:
/* count number of 1's in 9-bit argument (Schroeppel) */
unsigned count_ones(unsigned36 a) {
return ((a * 01001001001) /* 4 adjacent copies */
& 042104210421) /* every 4th bit */
% 15; /* casting out 15.'s in hexadecimal */
}
如何将其转换为 Rust 函数?这是我试过但不起作用的方法:
fn main() {
let a: u16 = 0b101_100_000;
println!("Ones in {:b}: {}", a, num_of_ones(a));
}
fn num_of_ones(quantity: u16) -> u8 {
(((quantity as u64 * 01_001_001_001) & 042_104_210_421) % 15) as u8
}
C 中的前导零 denotes an octal literal。 Rust 八进制以 0o
开头,就像您已经使用的 0b
:
(((quantity as u64 * 0o01_001_001_001) & 0o042_104_210_421) % 15) as u8
但是,不需要这个,因为它是 built-in,例如 u16::count_ones
:
println!("Ones in {:b}: {}", a, a.count_ones());
另请参阅: