位运算只要求了解,不要求掌握
基础概念
- 位运算符:用于对二进制数进行位操作。
-
&
:按位与 -
|
:按位或 -
^
:按位异或 -
<<
:左移 -
>>
:右移
-
- 赋值与位运算结合,先做位运算,在把位运算的结果赋值给运算符左边的变量。
-
<<=
:左移后赋值 -
>>=
:右移后赋值 -
&=
:按位与后赋值 -
^=
:按位异或后赋值 -
|=
:按位或后赋值
-
详解
二进制位运算是在数字的二进制表示形式上进行的运算。在Rust中,位运算符包括:
-
&
(按位与): 对两个数的每一位进行比较,只有两个对应的位都是1时,结果位才是1。 -
|
(按位或): 对两个数的每一位进行比较,只要有一个对应的位是1,结果位就是1。 -
^
(按位异或): 对两个数的每一位进行比较,如果对应的位不同,结果位是1;如果相同,结果是0。 -
!
(按位非): 反转操作数的每一位,即0变成1,1变成0。 -
<<
(左移): 将操作数的所有位向左移动指定的位数,右边空出的位用0填充。 -
>>
(右移): 将操作数的所有位向右移动指定的位数,对于无符号数,左边空出的位用0填充;对于有符号数,左边空出的位用符号位填充(保持符号位不变)。
图解按位与&
下面我将使用竖式来展示位运算中的“按位与”(AND)运算过程。假设我们有两个8位的二进制数进行按位与运算。
二进制数A: 10101010
二进制数B: 11001100
--------------------------
按位与结果: 10001000
在这个竖式中:
- 第一行是第一个二进制数
10101010
。 - 第二行是第二个二进制数
11001100
。 - 第三行是按位与的结果
10001000
。
按位与的规则是:只有两个比较的位都是1时,结果位才是1。所以,我们可以逐位比较: - 第1位:
1 & 1 = 1
- 第2位:
0 & 1 = 0
- 第3位:
1 & 0 = 0
- 第4位:
0 & 0 = 0
- 第5位:
1 & 1 = 1
- 第6位:
0 & 1 = 0
- 第7位:
1 & 0 = 0
- 第8位:
0 & 0 = 0
将这些结果组合起来,就得到了最终的按位与结果10001000
。
代码展示
下面通过一些Rust代码示例来详细解释这些运算符:
fn main() {
// 按位与
let a = 0b1010; // 二进制表示
let b = 0b1100;
let and = a & b; // 结果是 0b1000
// 按位或
let or = a | b; // 结果是 0b1110
// 按位异或
let xor = a ^ b; // 结果是 0b0110
// 按位非
let not_a = !a; // 结果是 0b0101 的补码,取决于系统是32位还是64位
// 左移
let left_shift = a << 2; // 结果是 0b101000
// 右移
let right_shift = a >> 1; // 结果是 0b0101
println!("{} {} {} {} {} {}", and, or, xor, not_a, left_shift, right_shift);
}
在Rust中,位运算符可以用于整数类型(如 i32
, u32
, i64
, u64
等)。
位运算在处理底层硬件、网络协议、加密算法等领域非常有用。例如,你可以使用位运算来设置或清除一个数字的特定位,从而实现某些标志或选项的开关。