Rust中对任意大小Vec<u32>所有元素执行按位运算的惯用实现方式
Rust中对任意大小Vec所有元素执行按位运算的惯用实现方式
在Rust里,处理这类对集合所有元素做累积运算的场景,最地道的方式就是利用迭代器的fold方法——它能优雅替代手动循环,完全贴合Rust的惯用风格,代码简洁还易读。
不同的按位运算需要搭配对应的初始值(也就是该运算的单位元),下面分场景给你具体示例:
按位与(AND):按位与的单位元是全1的
u32(u32::MAX),因为任何数和全1按位与都等于自身。用fold累积的代码如下:fn bitwise_and(vec: &Vec<u32>) -> u32 { vec.iter().fold(u32::MAX, |acc, &num| acc & num) }按位或(OR):按位或的单位元是0,任何数和0按位或都等于自身。实现代码:
fn bitwise_or(vec: &Vec<u32>) -> u32 { vec.iter().fold(0, |acc, &num| acc | num) }按位异或(XOR):异或的单位元同样是0,一个数异或0等于自身,异或自身等于0。实现代码:
fn bitwise_xor(vec: &Vec<u32>) -> u32 { vec.iter().fold(0, |acc, &num| acc ^ num) }
另外要注意空Vec的情况:按照上面的实现,空集合的运算结果会返回对应的单位元——比如空Vec的按位与返回u32::MAX,按位或和异或返回0,这符合数学上的累积运算定义,是合理的行为。
这种方式还有个额外好处:能无缝结合迭代器的其他适配器,比如你想先过滤掉某些元素再做运算,只需在fold前加对应的处理就行。比如只对奇数做按位或:
fn bitwise_or_odds(vec: &Vec<u32>) -> u32 { vec.iter() .filter(|&&num| num % 2 != 0) .fold(0, |acc, &num| acc | num) }
备注:内容来源于stack exchange,提问作者Dávid Tóth
相关产品推荐
相关产品推荐

