代码之家  ›  专栏  ›  技术社区  ›  Pizza Äcke

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

  •  -1
  • Pizza Äcke  · 技术社区  · 4 年前

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

    found 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 */
    }
    

    我怎样才能把它变成一个函数?这是我尝试过但不起作用的:

    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
    }
    
    1 回复  |  直到 4 年前
        1
  •  4
  •   Shepmaster Lukas Kalbertodt    4 年前

    C中的前导零 denotes an octal literal . 锈八进制以 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());
    

    另请参见: