为什么我的汉明重量函数在C中工作但在Rust中不起作用?

Mar*_*ght 3 hammingweight rust

我有鲁斯特以下海明重码,和它返回的垃圾0xffff0xffffffff,但在C相同的代码工作,所以我一定是误解的东西担心生锈怎么做位级操作.它完全是括号,所以我认为这不是运算符优先问题.

在C:

#include <stdio.h>

int hamming_weight(int val) {
    int v1 = val - ((val >> 1) & 0x55555555);
    int v2 = (v1 & 0x33333333) + ((v1 >> 2) & 0x33333333);
    return (((v2 + (v2 >> 4)) & 0xF0F0F0F) * 0x1010101) >> 24;
}

int main() {
    printf("%x -> %d\n", 7, hamming_weight(7));
    printf("%x -> %d\n", 0xff, hamming_weight(0xff));
    printf("%x -> %d\n", 0xffff, hamming_weight(0xffff));
    printf("%x -> %d\n", 0xffffffff, hamming_weight(0xffffffff));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

结果:

7 -> 3
ff -> 8
ffff -> 16
ffffffff -> 32
Run Code Online (Sandbox Code Playgroud)

在Rust(我必须使用u64来防止溢出恐慌0xffff):

fn hamming_weight(val: u64) -> u64 {
    let v1 = val - ((val >> 1) & 0x55555555);
    let v2 = (v1 & 0x33333333) + ((v1 >> 2) & 0x33333333);
    (((v2 + (v2 >> 4)) & 0xF0F0F0F) * 0x1010101) >> 24
}

fn main() {
    println!("{:x} {}", 7, hamming_weight(7));
    println!("{:x} {}", 0xff, hamming_weight(0xff));
    println!("{:x} {}", 0xffff, hamming_weight(0xffff));
    println!("{:x} {}", 0xffffffffu32, hamming_weight(0xffffffffu64));
}
Run Code Online (Sandbox Code Playgroud)

结果:

7 3
ff 8
ffff 2064
ffffffff 135272480
Run Code Online (Sandbox Code Playgroud)

我正在使用Rust 1.16.我知道Rust有count_ones()- 编译器在我编写这段代码时告诉我,这非常了不起,但我选择不使用它.

She*_*ter 12

我不得不用来u64防止溢出恐慌0xffff

那是你的问题.原始C代码依赖于操作溢出.增加类型的大小不会修复它,但允许溢出包装会:

fn hamming_weight(val: u32) -> u32 {
    let v1 = val - ((val >> 1) & 0x55555555);
    let v2 = (v1 & 0x33333333) + ((v1 >> 2) & 0x33333333);
    (((v2 + (v2 >> 4)) & 0xF0F0F0F).wrapping_mul(0x1010101)) >> 24
}
Run Code Online (Sandbox Code Playgroud)