如何设置、清除和切换一点 rust 迹?

推荐答案

与许多其他语言一样,位运算符&(位AND)、|(位OR)、^(位XOR)也存在:

fn main() {
    let mut byte: u8 = 0b0000_0000;

    byte |= 0b0000_1000; // Set a bit
    println!("0b{:08b}", byte);

    byte &= 0b1111_0111; // Unset a bit
    println!("0b{:08b}", byte);

    byte ^= 0b0000_1000; // Toggle a bit
    println!("0b{:08b}", byte);
}

与其他语言的主要区别在于按位NOT,它使用!而不是~:

fn main() {
    let mut byte: u8 = 0b0000_0000;

    byte = !byte; // Flip all bits
    println!("0b{:08b}", byte);
}

还可以将位向左或向右移位:

fn main() {
    let mut byte: u8 = 0b0000_1000;

    byte <<= 1; // shift left one bit
    println!("0b{:08b}", byte);

    byte >>= 1; // shift right one bit
    println!("0b{:08b}", byte);
}

还有许多其他概念性的东西最终会进行位级操作,而不是用运算符来表示.查看documentation for an integer个例子.一个有趣的例子是leading_zeros.下面是如何旋转一定数量的位:

fn main() {
    let mut byte: u8 = 0b1000_0000;

    byte = byte.rotate_left(1); // rotate left one bit
    println!("0b{:08b}", byte);

    byte = byte.rotate_right(1); // rotate right one bit
    println!("0b{:08b}", byte);
}

The book has some more information

Rust相关问答推荐

值为可变对象的不可变HashMap

除了调用`waker.wake()`之外,我如何才能确保future 将再次被轮询?

S在Cargo.toml中添加工作空间开发依赖关系的正确方法是什么?

你能在Rust中弃用一个属性吗?

Rust ndarray:如何从索引中 Select 数组的行

如何设置activx websocket actorless的消息大小限制?

减少指示ProgressBar在Rust中的开销

为什么特征默认没有调整大小?

try 实现线程安全的缓存

当锁被释放时,将锁包装到作用域中是否会发生变化?

为什么这段 Rust 代码会在没有递归或循环的情况下导致堆栈溢出?

(let b = MyBox(5 as *const u8); &b; ) 和 (let b = &MyBox(5 as *const u8); ) 之间有什么区别

在 Bevy 项目中为 TextureAtlas 精灵实施 NearestNeighbor 的正确方法是什么?

为什么我不能克隆可克隆构造函数的Vec?

仅当满足外部条件时如何添加到 actix web 的路由

预期类型参数,发现不透明类型

我可以在不调用 .clone() 的情况下在类型转换期间重用 struct 字段吗?

覆盖类型的要求到底是什么?为什么单个元素元组满足它?

BigUint 二进制补码

为什么这个 Trait 无效?以及改用什么签名?