如何将计算9位位掩码中1个数的C函数转换为Rust



我有一个u16,用来保存9位位掩码,我想知道它包含多少1

我发现了这个算法,我不知道它是如何或为什么工作的:

/* 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中的前导零表示八进制文字。Rust八进制以0o开头,就像您已经使用的0b一样:

(((quantity as u64 * 0o01_001_001_001) & 0o042_104_210_421) % 15) as u8

但是,不需要这个,因为它是内置的,例如u16::count_ones:

println!("Ones in {:b}: {}", a, a.count_ones());

另请参阅:

  • 如何在Rust中设置、清除和切换单个位

最新更新