You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Rust中扩展usize类型以实现自定义位操作功能?

如何让自定义的PermutableUsize结构体支持usize的运算而无需重写所有方法?

你可以通过实现Deref和DerefMut trait,让PermutableUsize自动解引用为内部的usize值,直接复用usize的所有运算符和方法,无需手动逐个实现AddAssign、Sub等trait。

具体实现步骤

  1. 导入std::ops模块下的Deref和DerefMut trait;
  2. 为PermutableUsize实现Deref,返回内部value的引用;
  3. 为PermutableUsize实现DerefMut,返回内部value的可变引用。

修改后的完整代码

use std::ops::{Deref, DerefMut};
use std::fmt;

struct PermutableUsize {
    value: usize,
    num_bits: usize,
}

impl PermutableUsize {
    fn new(value: usize, num_bits: usize) -> Self {
        // 可选:初始化时截断值到位长度范围内,避免超出位宽
        let masked_value = value & ((1 << num_bits) - 1);
        Self {
            value: masked_value,
            num_bits,
        }
    }

    // 计算下一个位的字典序排列
    fn next_permutation(&mut self) {
        let t = self.value | (self.value - 1);
        let ctz_v = self.value.trailing_zeros();
        self.value = (t + 1) | (((!t & (!t).wrapping_neg()) - 1) >> (ctz_v + 1));
        // 可选:确保排列后的值不超出位长度范围
        self.value &= ((1 << self.num_bits) - 1);
    }
}

// 实现Deref,允许自动解引用为usize
impl Deref for PermutableUsize {
    type Target = usize;

    fn deref(&self) -> &Self::Target {
        &self.value
    }
}

// 实现DerefMut,允许自动可变解引用为usize
impl DerefMut for PermutableUsize {
    fn deref_mut(&mut self) -> &mut Self::Target {
        &mut self.value
    }
}

impl fmt::Binary for PermutableUsize {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "{:0width$b}", self.value, width = self.num_bits)
    }
}

fn main() {
    let mut permutable_usize = PermutableUsize::new(0b00010011, 8);
    println!("Initial value: {:b}", permutable_usize); 

    // 现在可以直接使用usize的运算符
    permutable_usize += 1;
    println!("After +=1: {:b}", permutable_usize); 

    permutable_usize.next_permutation();
    println!("Next permutation: {:b}", permutable_usize); 

    // 还可以使用usize的其他方法
    println!("Trailing zeros: {}", permutable_usize.trailing_zeros());
}

关键说明

  • Deref/DerefMut的作用:Rust的解引用强制多态特性会自动将&PermutableUsize转换为&usize,将&mut PermutableUsize转换为&mut usize,因此所有usize支持的运算(如+=、-、*)和方法(如trailing_zeros、count_ones)都能直接在PermutableUsize实例上使用。
  • 可选的位宽约束:如果需要确保运算后的值不会超出设定的位长度,可以在初始化、next_permutation或手动实现的运算符中加入掩码截断逻辑(如代码中的value & ((1 << num_bits) - 1)),避免值溢出位宽。

内容的提问来源于stack exchange,提问作者Dave

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 05:12:46