# 位字段

### 定义和操作位字段

使用 `bitflags!` 宏可以帮助我们创建安全的位字段类型 `MyFlags`，然后为其实现基本的 `clear` 操作。以下代码展示了基本的位操作和格式化:

    use bitflags::bitflags;
    use std::fmt;

    bitflags! {
        struct MyFlags: u32 {
            const FLAG_A       = 0b00000001;
            const FLAG_B       = 0b00000010;
            const FLAG_C       = 0b00000100;
            const FLAG_ABC     = Self::FLAG_A.bits
                               | Self::FLAG_B.bits
                               | Self::FLAG_C.bits;
        }
    }

    impl MyFlags {
        pub fn clear(&mut self) -> &mut MyFlags {
            self.bits = 0;
            self
        }
    }

    impl fmt::Display for MyFlags {
        fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
            write!(f, "{:032b}", self.bits)
        }
    }

    fn main() {
        let e1 = MyFlags::FLAG_A | MyFlags::FLAG_C;
        let e2 = MyFlags::FLAG_B | MyFlags::FLAG_C;
        assert_eq!((e1 | e2), MyFlags::FLAG_ABC);
        assert_eq!((e1 & e2), MyFlags::FLAG_C);
        assert_eq!((e1 - e2), MyFlags::FLAG_A);
        assert_eq!(!e2, MyFlags::FLAG_A);

        let mut flags = MyFlags::FLAG_ABC;
        assert_eq!(format!("{}", flags), "00000000000000000000000000000111");
        assert_eq!(format!("{}", flags.clear()), "00000000000000000000000000000000");
        assert_eq!(format!("{:?}", MyFlags::FLAG_B), "FLAG_B");
        assert_eq!(format!("{:?}", MyFlags::FLAG_A | MyFlags::FLAG_B), "FLAG_A | FLAG_B");
    }