#bitmask #structure #bit #flags

no-std bitflags

A macro to generate structures which behave like bitflags

46 releases (27 stable)

2.9.0 Mar 1, 2025
2.6.0 Jun 24, 2024
2.5.0 Mar 19, 2024
2.4.1 Oct 15, 2023
0.1.1 Feb 9, 2015

#1 in Rust patterns

Download history 6251746/week @ 2024-12-05 5869103/week @ 2024-12-12 4171304/week @ 2024-12-19 2797959/week @ 2024-12-26 4692959/week @ 2025-01-02 6024813/week @ 2025-01-09 5773521/week @ 2025-01-16 6339265/week @ 2025-01-23 6857303/week @ 2025-01-30 6970107/week @ 2025-02-06 6569281/week @ 2025-02-13 7433894/week @ 2025-02-20 7158407/week @ 2025-02-27 7906685/week @ 2025-03-06 7880880/week @ 2025-03-13 7712898/week @ 2025-03-20

31,903,071 downloads per month
Used in 77,883 crates (3,090 directly)

MIT/Apache

150KB
3.5K SLoC

bitflags

Rust Latest version Documentation License

bitflags generates flags enums with well-defined semantics and ergonomic end-user APIs.

You can use bitflags to:

  • provide more user-friendly bindings to C APIs where flags may or may not be fully known in advance.
  • generate efficient options types with string parsing and formatting support.

You can't use bitflags to:

  • guarantee only bits corresponding to defined flags will ever be set. bitflags allows access to the underlying bits type so arbitrary bits may be set.

  • define bitfields. bitflags only generates types where set bits denote the presence of some combination of flags.

  • Documentation

  • Specification

  • Release notes

Usage

Add this to your Cargo.toml:

[dependencies]
bitflags = "2.9.0"

and this to your source code:

use bitflags::bitflags;

Example

Generate a flags structure:

use bitflags::bitflags;

// The `bitflags!` macro generates `struct`s that manage a set of flags.
bitflags! {
    /// Represents a set of flags.
    #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
    struct Flags: u32 {
        /// The value `A`, at bit position `0`.
        const A = 0b00000001;
        /// The value `B`, at bit position `1`.
        const B = 0b00000010;
        /// The value `C`, at bit position `2`.
        const C = 0b00000100;

        /// The combination of `A`, `B`, and `C`.
        const ABC = Self::A.bits() | Self::B.bits() | Self::C.bits();
    }
}

fn main() {
    let e1 = Flags::A | Flags::C;
    let e2 = Flags::B | Flags::C;
    assert_eq!((e1 | e2), Flags::ABC);   // union
    assert_eq!((e1 & e2), Flags::C);     // intersection
    assert_eq!((e1 - e2), Flags::A);     // set difference
    assert_eq!(!e2, Flags::A);           // set complement
}

Rust Version Support

The minimum supported Rust version is documented in the Cargo.toml file. This may be bumped in minor releases as necessary.

Dependencies

~0–455KB