Rust 位运算符

2 minute read Published: 2022-04-13

本文代码

#[test]
fn test() {
    // 与
    // 4 -> 00000000 00000000 00000000 00000100
    // 6 -> 00000000 00000000 00000000 00000110
    // 双方为 1,结果为 1
    println!("{}", 4 & 6); // 4

    // 或
    // 4 -> 00000000 00000000 00000000 00000100
    // 6 -> 00000000 00000000 00000000 00000110
    // 一方或双方为 1,结果为 1
    println!("{}", 4 | 6); // 6

    // 异或
    // 4 -> 00000000 00000000 00000000 00000100
    // 6 -> 00000000 00000000 00000000 00000110
    // 双方相同为 0,双方不同为 1
    println!("{}", 4 ^ 6); // 2

    // 非
    // 15 -> 00000000 00000000 00000000 00001111
    // 1 变为 0,0 变为 1
    println!("{}", !15); // -16

    // 左移
    // 2 -> 00000000 00000000 00000000 00000010
    println!("{}", 2 << 2); // 8

    // 右移
    // 8 -> 00000000 00000000 00000000 00001000
    println!("{}", 8 >> 2); // 2

    // 正数的反码等同原码,负数的反码为原码的符号位不变,其余逐位取反
    // 正数的补码等同原码,负数的补码为反码 + 1
    // 负数以原码的补码表示
    // 1 原码 -> 00000000 00000000 00000000 00000001
    // -1 原码 -> 10000000 00000000 00000000 00000001
    // -1 反码 -> 11111111 11111111 11111111 11111110
    // -1 补码 -> 11111111 11111111 11111111 11111111
    println!("{:b}", 1);
    println!("{:b}", -1);
}