xor rax,rax call printf bts qword [bitflags],4 ; set bit 4 ;print bitflags rax,rax call printf bts qword [bitflags],7 ; set bit 7 ;print bitflags mov rdi call printf bts qword [bitflags],8 ; set bit 8 ;print bitflags mov rdi, [bitflags ],61 ; set bit 61 ;print bitflags mov rdi, [bitflags] call printb ;clear bit 8 ( ],8 ; bit reset 8 ;print bitflags mov rdi, [bitflags] call printb ; test bit 61 (will
) {} constexpr BitFlags(std::initializer_list<T> vs) : BitFlags() { for(T v : vs){ flags_ (lhs.flags_ |ToUnderlying(rhs)); } friendconstexprBitFlagsoperator|(BitFlags lhs,BitFlags rhs){ returnBitFlags _ &ToUnderlying(rhs)); } friendconstexprBitFlagsoperator&(BitFlags lhs,BitFlags rhs){ returnBitFlags( _ ^ToUnderlying(rhs)); } friendconstexprBitFlagsoperator^(BitFlags lhs,BitFlags rhs){ returnBitFlags( _ |=ToUnderlying(rhs); return lhs; } friendconstexprBitFlags&operator|=(BitFlags& lhs,BitFlags rhs){
虽然bool本身不支持位级操作,但Rust生态提供了bitflags等crate来满足这种需求: use bitflags::bitflags; bitflags! 与手动位操作相比,bitflags通过类型系统防止了错误的标志组合,同时编译器能够生成与手写位运算同样高效的机器码。这再次印证了Rust的核心理念:安全抽象不应以性能为代价。
Tokio,async programming engine Serde,Serialization/Deserialization library Regex,regular expressions Bitflags
gen_ndis_set_resp switch (OID) { case RNDIS_OID_GEN_CURRENT_PACKET_FILTER: /* these NDIS_PACKET_TYPE_* bitflags
Adding base64 v0.13.1 (latest: v0.22.1) Adding base64 v0.21.7 (latest: v0.22.1) Adding bitflags crossbeam-channel v0.5.13 Downloaded cfb v0.7.3 Downloaded cc v1.1.7 Downloaded bytes v1.7.1 Downloaded bitflags Downloaded cfg-if v1.0.0 Downloaded cargo_toml v0.15.3 Downloaded proc-macro2 v1.0.86 Downloaded bitflags v0.14.5 Compiling log v0.4.22 Compiling lock_api v0.4.12 Compiling fnv v1.0.7 Compiling bitflags Compiling rustc_version v0.4.0 Compiling tao v0.16.9 Compiling aho-corasick v1.1.3 Compiling bitflags
unsigned int flag2 : 1; unsigned int flag3 : 1; unsigned int flag4 : 1; // 可以继续添加更多标志位 } BitFlags int b = 32; printf("%d / 2^%d = %d\n", b, power - 1, fast_divide(b, power)); // 紧凑存储示例 BitFlags flags; flags.flag1 = 1; flags.flag2 = 0; flags.flag3 = 1; flags.flag4 = 0; printf("BitFlags 紧凑存储:使用位字段(BitFlags结构体)来紧凑地存储一组布尔值。每个标志位只占1位,从而节省存储空间。
内核使用线性映射的偏移量 pub const KERNEL_MAP_OFFSET: usize = 0xffff_ffff_0000_0000; 需要加入两个关于位操作的辅助 crate: os/Cargo.toml: bitflags mapping/page_table_entry.rs 对于页表项的一些功能函数: use crate::memory::address::*; use bit_field::BitField; use bitflags page_number", &self.page_number()) .field("flags", &self.flags()) .finish() } } bitflags
unsigned char
fd; /* current FD, or VFD_CLOSED if none */ unsigned short fdstate; /* bitflags
标志位 BitFlags 内容和说明如下: 标识 说明 0x01 建议加密连接 0x02 仅上传(做种状态) 0x04 支持 UTP 0x08 支持 ut_holepunch 0x10 传出连接且对等方可达
bitflags { ( $(#[$outer:meta])* pub struct $BitFlags:ident: $T:ty { $
bitflags { ( $(#[$outer:meta])* pub struct $BitFlags:ident: $T:ty { $
作者的库参照了nnnoiseless的编写思路,使用了smallvec和bitflags两款小依赖。 编写这个库,作者首先编写C库的Rust应用接口。
但在Rust程序中,就不得不引入外部软件包bitflags了。 C内存布局Rust枚举类分辨因子discriminant只能是i32类型 — 【存储宽度size】是固定的4字节。
version_check v0.9.4 Compiling proc-macro2 v1.0.47 Compiling unicode-ident v1.0.5 Compiling bitflags