如何在Rust中设置,清除和切换?
答案 0 :(得分:21)
与许多其他语言一样,存在按位运算符&
(按位AND),|
(按位OR),^
(按位异或):
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);
}
答案 1 :(得分:4)
Rust有两个位运算符和二进制格式打印(非常有助于调试):
fn bit_twiddling(original: u8, bit: u8) {
let mask = 1 << bit;
println!(
"Original: {:b}, Set: {:b}, Cleared: {:b}, Toggled: {:b}",
original,
original | mask,
original & !mask,
original ^ mask
);
}
fn main() {
bit_twiddling(0, 3);
bit_twiddling(8, 3);
}
它还具有复合赋值变体(|=
,&=
和^=
)。