#bitset #bit-manipulation #bit-fields #bitfields

bitworks

库旨在提供易于使用的位集,并强调安全性

3个不稳定版本

0.2.0 2024年2月25日
0.1.5 2024年2月14日
0.0.1 2024年2月13日

#608 in 数据结构

Download history 14/week @ 2024-04-02 1/week @ 2024-05-28 3/week @ 2024-06-04

每月 310次下载
用于 2 crates

MIT/Apache

225KB
5K SLoC

Rust

库旨在提供易于使用的位集,并提供一些开箱即用的功能。

启用功能"serde"以启用适用于大多数类型的serde::Serializeserde::Deserialize

使用概述

use bitworks::prelude::*;

fn main() {
    // Build the bitset with variety of methods.
    let mut bitset = Bitset8::NONE
        .clone()
        .include(Bitset8::new(0b10000000))
        .set(Index8::from_usize(1))
        .replace(Index8::from_usize(3), One)
        .flip(Index8::from_usize(5))
        .build();

    assert_eq!(bitset.into_inner(), 0b10101010);

    // Iterate over bits as copies, references or mutable references.
    for mut bit in bitset.bits_mut() {
        *bit = !*bit;
    }

    assert_eq!(bitset.into_inner(), 0b01010101);

    assert_eq!(bitset.bit(Index8::from_usize(7)), Zero);

    let other = Bitset8::new(0b11110000);

    // Use Set operations.
    let bitset = bitset.complement();

    assert_eq!(bitset.into_inner(), 0b10101010);
    assert_eq!(bitset.union(other).into_inner(), 0b11111010);
    assert_eq!(bitset.intersection(other).into_inner(), 0b10100000);
    assert_eq!(bitset.difference(other).into_inner(), 0b00001010);
    assert_eq!(bitset.sym_difference(other).into_inner(), 0b01011010);

    assert!(bitset.intersects(&other));
    assert!(!bitset.includes(&other));
    assert!(Bitset8::ALL.includes(&bitset));

    // Expand, combine and split.
    let bigger_bitset: Bitset16 = bitset.expand();

    assert_eq!(bigger_bitset.into_inner(), 0b0000000010101010);

    let combined: Bitset16 = bitset.combine(other);

    assert_eq!(combined.into_inner(), 0b1111000010101010);

    let (bitset, other) = combined.split::<Bitset8, Bitset8>();

    assert_eq!(bitset.into_inner(), 0b10101010);
    assert_eq!(other.into_inner(), 0b11110000);

    // Collect in other collections and construct from them.
    let v: Vec<Bit> = bitset.bits().rev().collect();

    assert_eq!(&v, &[One, Zero, One, Zero, One, Zero, One, Zero]);

    let bitset = Bitset8::from_iterable(&v);
    assert_eq!(bitset.into_inner(), 0b01010101);
}

许可协议

根据您选择的任何一种许可协议:

任选其一。

贡献

除非您明确声明,否则根据Apache-2.0许可证定义的,您有意提交的任何贡献,均应双重许可,如上所述,不附加任何额外条款或条件。

依赖关系

~170KB