0191. Number of 1 Bits

问题描述

这个题目考察位操作的.

先考虑比特位操作的函数表:

ABA OR BA AND BA XOR BNOT A
111100
101010
011011
000001

其次是如何遍历 u32 的所有比特位? 是的, 用右移 (shift right), 依次将每一个比特位右移到最低位, 然后结合上面的逻辑与操作(bitwise AND), 就可以取出这个比特位的值, 是 0 或者 1.

下图展示的是 n=11 (即 0b1011) 时的右移操作:

walk-through u32

想明白了上面的过程, 代码就比较容易了.

#![allow(unused)]
fn main() {
pub fn hamming_weight3(n: i32) -> i32 {
    let mut count = 0;
    for i in 0..32 {
        count += n >> i & 1;
    }
    count
}
}

或者使用函数式风格的写法:

#![allow(unused)]
fn main() {
pub fn hamming_weight4(n: i32) -> i32 {
    (0..32).map(|i| n >> i & 1).sum()
}
}