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);
}
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);
}
3条答案
按热度按时间yeotifhr1#
与许多其他语言一样,存在位运算符
&
(位与)、|
(位或)、^
(位异或):与其他语言的主要区别在于按位NOT,它使用
!
而不是~
:您还可以将位左移或右移:
还有许多其他概念性的东西最终会执行位级操作,但这些操作并没有用运算符来表示。请查看documentation for an integer的例子。一个有趣的例子是
leading_zeros
。下面是如何循环一定数量的位:The book has some more information
1szpjjfi2#
Rust有位操作符和二进制格式打印(对调试非常有帮助):
它还具有化合物归属变体(
|=
、&=
和^=
)。The book has some more information
guz6ccqo3#
此外,我想添加以下使用情形:如果你有一个像
0b10001000
这样的位域,并且你想在任何情况下都将第3位更新为true或false,你可以这样做: