#bitmap #unsigned-integer #bit-flags #flags #bit #bits #static

bin+lib fixed_bitmaps

一个小型库,实现围绕原始 Rust 无符号整数的位图功能

19 个版本 (9 个重大变更)

0.10.2 2021 年 11 月 7 日
0.9.3 2021 年 10 月 14 日

#896 in 数据结构

每月下载量 33

MIT/Apache

145KB
3.5K SLoC

Fixed Bitmaps

Build Status API crates.io Downloads License

实现围绕原始 Rust 无符号整数的位图功能。我在想要一个简单的数据结构来使用位标志后,最终制作了这个库。当然,其他选项肯定存在,但有些看起来很吓人,而有些则在我制作这个之后才找到,而且,我只是想制作一个我愿意发布的库!

这些位图仅用于当您想要一个数据结构来存储布尔标志时,这些标志可以以尽可能压缩的格式进行 AND、OR 和 XOR 操作,同时仍然具有足够的函数来轻松查看位图进行显示或获取特定的位。使用此库非常简单,如果您想要一个相对较小、稳定、快速且易于使用的依赖项,这可能就是您需要的!

这个库不是 灵活的!您可以使用这个库制作的最大的位图是 128 位长,因此如果您需要更大的位图,您可能希望访问其他实现此功能的库。我会推荐的一个,这个库最终与它非常相似,是 bit-vec

功能

  • 现在所有基本的无符号整数类型都有了包装,从 u8u128,还包括对 usize 的包装 (BitmapArch)。
  • 支持位运算(AND、OR、XOR、NOT)和算术运算(加、减、乘、除)在位图之间以及位图与其相应整数类型之间进行。
  • 实现了 Display 以显示位图的全部 1 和 0。 (然而,最终可能会将其改为 Debug 特性,这将在发布 1.0.0 之前需要考虑)。
  • 现在支持在 Bitmap 和其关联的整数类型之间使用专用方法或解引用运算符 * 进行轻松转换。
  • 现在支持左右移位

代码示例

use fixed_bitmaps::Bitmap64;

// Multiple ways to create a new bitmap
let empty = Bitmap64::default();
let empty = Bitmap64::new(false);

let full = Bitmap64::from(u64::MAX);
let full = Bitmap64::new(true);

let mask = Bitmap64::create_bit_mask(2, 6, true); // Creates bitmap with last bits 111100
let mask = Bitmap64::create_bit_mask(2, 6, false); // Creates bitmap 11..11000011

// Equivalent ways to create a bitmap with last bits 1001
let bitmap = Bitmap64::from(9);
let bitmap = Bitmap64::from(0b1001);

// Sets the 7th least significant bit when creating a new
// bitmap (indexing starts at 0)
let mut bitmap = Bitmap64::from_set(6).unwrap();

// Use the set() method to work with specific bits
bitmap.set(6, false).unwrap();
bitmap.set(42, true).unwrap();

// Use get() to know the value of a specific bit
println!("Bit at index 42: {}", bitmap.get(42).unwrap());

// Freely use boolean operators &, |, and ^
let bitmap1 = Bitmap64::from(0b1001);
let bitmap2 = Bitmap64::from(0b1010);

let and = bitmap1 & bitmap2;
let or = bitmap1 | bitmap2;
let xor = bitmap1 ^ bitmap2;

// The following also works exactly the same
let and = bitmap1 & 0b1010;
let or = bitmap1 | 0b1010;
let xor = bitmap1 ^ 0b1010;

// You can also use the not operator ! to get the flipped version of
// the bitmap
let flipped = !bitmap;

// Aritmetic operators are currently used as exactly that, the following
// is guarunteed to continue working as it does
let add = bitmap1 + 10;
let sub = bitmap1 - 4;
let mul = bitmap2 * 2;
let div = bitmap2 / 2;

// The following works exactly as above, but is likely to change in
// favour of set operations in the major update to 1.0.0
let add = bitmap1 + Bitmap64::from(10);
let sub = bitmap1 - Bitmap64::from(4);
let mul = bitmap2 * Bitmap64::from(2);
let div = bitmap2 / Bitmap64::from(2);

// Left and right shifts work exactly as they do with integers
let lsh = bitmap1 << 3;
let rsh = bitmap2 >> 1;

待完成

  • 文档总是需要改进的,任何文档更改或小错误修复都会导致补丁更新。
  • 每当定义和实现了一个新的结构或定义了一个新的函数时,将发布一个小更新。
  • 当这一部分经过充分测试和基准测试,并且我可能遗漏的任何其他重要组件都添加后,我将发布fixed_bitmaps 1.0.0作为主要更新,以表明它已准备好全面生产。
  • 最终要创建的最终结构可能是BitmapLarge结构,或类似的东西。这将有一个固定的尺寸,但用户可以定义这个尺寸是多少。目标是创建一个不能增长或缩小的结构,但可以从一开始就有一个大容量。这类似于bit-vec,只是没有动态增长属性,所以我认为它应该更容易在栈上而不是在堆上存储,从而获得更好的性能。

贡献

欢迎贡献,无论是更好的文档、错误修复还是代码本身的优化!

在做出更改时,仅对以下文件进行更改(除非你打算添加新的模块或其他类似的东西)

  • fixed_bitmaps/src/primitives/bitmap128.rs
  • fixed_bitmaps/tests/primitives/bitmap128.rs
  • fixed_bitmaps/src/oversized/bitmap_kb.rs
  • fixed_bitmaps/tests/oversized/bitmap_kb.rs

然后你可以在该项目上运行cargo run,它将通过各自目录中的所有其他文件传播更改,适应每个模块旨在支持的特定原语。

运行cargo test以确保你的更改通过了当前实现的测试,或者运行你设置的新测试!

依赖项

~0.4–1MB
~22K SLoC